【问题标题】:Mysql like and BOOLEAN MODE (FULLTEXT) searchMysql like 和 BOOLEAN MODE (FULLTEXT) 搜索
【发布时间】:2013-06-04 07:52:29
【问题描述】:

我正在尝试编写一个查询来使用通配符搜索记录。

我在下面有两个有效的查询,但我想知道哪一个更优化。

查询一确实给了我想要的东西,但查询二给了我不同的结果。

我应该使用哪一个。

  1. 在我的查询中使用 Like。

    SELECT code, name
    FROM countryCounty
    WHERE name LIKE  '%County Down%'
    AND isActive =1
    AND countryISO2FK =  'GB'
    LIMIT 1
    
  2. 然后我有布尔模式(FULLTEXT)查询。

    SELECT code,name, match( name )
    AGAINST ( 'County Down' IN BOOLEAN MODE ) AS relevance
    FROM opjb_countryCounty 
    WHERE match( name ) AGAINST ( '%County Down%' IN BOOLEAN MODE ) 
        AND isActive=1 
        AND countryISO2FK='GB' 
    ORDER BY relevance DESC LIMIT 1
    

【问题讨论】:

标签: mysql


【解决方案1】:

这两个查询之间存在显着差异。

第一个查询是在 name 列中搜索单个字符串 'County Down' 的出现。

第二个查询是在文本中搜索两个单独的单词(单独的字符串)'County''Down' 中的任何一个的出现。 (我不知道第二个查询中'County' 之前的'%' 字符的目的和效果。)

BOOLEAN MODE 全文搜索的相关性将为 1.0。如果您只想返回同时包含“County”和“Down”这两个词的行,那么您真的想在每个词之前使用'+' 限定符,例如:

MATCH(name) AGAINST('+County +Down' IN BOOLEAN MODE)

请注意,此谓词还将“匹配”到包含 'Some Down and out County' 的名称,例如,第一个查询不会。


此外,用于获取按相关性排序的结果集的方法几乎是正确的。有一个微妙的问题:包含 IN BOOLEAN MODE 修饰符会导致表达式返回 1.0,而不是像 NATURAL LANGUAGE MODE 返回的那样返回加权浮点数。


回答您的问题:如果第一个查询返回您需要的结果集,则使用该查询。该查询的缺点是该查询中的 LIKE 谓词不可搜索,也就是说,MySQL 不能利用索引范围扫描来满足该谓词。 (索引可以用于其他谓词,但需要检查每一行上的 name 列。

第二种形式的查询的优点是它可以利用一个 FULLTEXT INDEX,如果创建了一个,这可以提高性能。

【讨论】:

  • 感谢您的回答。我只是想看看哪一个是最好的。我已将全文添加到我的表中以索引关键字,但没有为此表。
【解决方案2】:

查询一确实给了我想要的东西,但查询二给了我不同的结果。

WHERE name LIKE '%County Down%'

WHERE match(name) AGAINST ('%County Down%' IN BOOLEAN MODE)

第一个查询将返回“LACounty Down”和“NYCounty Down”的结果,但第二个查询不会返回这些结果。不过,这两个查询都会返回“LA County Down”和“NY County Down”之类的结果。

要使结果匹配并让它返回这些“模糊匹配”结果,请将您的第二个查询更改为...

WHERE match( name ) AGAINST ( '*County Down*' IN BOOLEAN MODE )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2011-10-06
    相关资源
    最近更新 更多