Mysql喜欢和BOOLEAN MODE(FULLTEXT)搜索

时间:2013-06-07 22:09:59

标签: mysql

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

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

查询一个确实给了我正在寻找的东西,但查询二给了我不同的结果。

我应该使用哪一个。

  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
    

2 个答案:

答案 0 :(得分:5)

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

第一个查询是在名称列中搜索单个字符串'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(如果创建了一个),这可以提高性能。

答案 1 :(得分:1)

  

查询一个确实给了我正在寻找的东西,但查询二给了我不同的结果。

     

名称LIKE'%郡下降%'

     

在哪里匹配(姓名)反对('%郡下降%'在布尔模式中)

第一个查询将返回" LACounty Down"和" NYCounty Down",但第二个查询不会返回这些结果。这两个查询都会返回" LA County Down"和#34; NY County Down,"虽然。

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

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