3

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

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

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

我应该使用哪一个。

  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
    
4

2 回答 2

6

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

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

第二个查询是在文本中搜索两个单独的单词(单独的字符串)中的任何一个的出现'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,它可以利用它,这可以提高性能。

于 2013-06-07T23:04:51.377 回答
1

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

WHERE name LIKE '%County Down%'

在哪里匹配(名称)反对(布尔模式中的“%County Down%”)

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

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

WHERE match( name ) AGAINST ( '*County Down*' IN BOOLEAN MODE )
于 2018-05-01T17:26:47.387 回答