Mysql喜欢和BOOLEAN MODE(FULLTEXT)搜索

use*_*132 3 mysql

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

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

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

我应该使用哪一个.

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

    SELECT code, name
    FROM countryCounty
    WHERE name LIKE  '%County Down%'
    AND isActive =1
    AND countryISO2FK =  'GB'
    LIMIT 1
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

spe*_*593 5

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

第一个查询是在'County Down'名称列中搜索单个字符串的出现位置.

第二次查询是用于搜索的任两个单独的词(单独的串)的发生'County''Down'在文本中.(在第二次查询'%'之前,该角色的目的和效果'County'对我来说是未知的.)

BOOLEAN MODE全文搜索的相关性将为1.0.如果你只想返回那些同时包含'County'和'Down'字样的行,那么你真的想'+'在每个单词之前使用限定符,例如:

MATCH(name) AGAINST('+County +Down' IN BOOLEAN MODE)
Run Code Online (Sandbox Code Playgroud)

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


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


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

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