我正在尝试使用通配符编写查询来搜索记录.
我在下面有两个查询,但我想知道哪一个更优化.
查询一个确实给了我正在寻找的东西,但查询二给了我不同的结果.
我应该使用哪一个.
在我的查询中使用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)然后我有布尔模式(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)两个查询之间存在显着差异.
第一个查询是在'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(如果创建了一个),这可以提高性能.