当用户键入时,我正在执行全文搜索,并且遇到了一个行为不符合我预期的实例。
我在带有全文索引的单列中包含以下数据:
Adrienna O'ROURKE O'ROURKE Adrienna F 1949-04-09 单例小姐 6908
Olivia O'Toole O'Toole Olivia F 1989-06-30 单例小姐 4362
Owen O'Leary O'Leary Owen M 1979-01-12 单例先生 4533
下面的查询无法匹配“O'Rourke”,但匹配包含“O'Toole”和“O'Leary”的行:
SELECT distinct o.*
FROM pcObjects o
WHERE MATCH(ObjectSearchData) AGAINST('*O\'*' IN BOOLEAN MODE)
ORDER BY MATCH(ObjectSearchData) AGAINST('*O\'*' IN BOOLEAN MODE) DESC
此查询与“O'Rourke”条目匹配:
SELECT distinct o.*
FROM pcObjects o
WHERE MATCH(ObjectSearchData) AGAINST('*O\'Rou*' IN BOOLEAN MODE)
ORDER BY MATCH(ObjectSearchData) AGAINST('*O\'Rou*' IN BOOLEAN MODE) DESC
谁能解释一下为什么“O'Rourke”一开始就没有被发现,但“O'Toole”却被发现了?谢谢。
最佳答案
据我所知,BOOLEAN
模式返回 1 或 0,没有浮点相关值,因此您只需要:
SELECT distinct o.*
FROM pcObjects o
WHERE MATCH(ObjectSearchData) AGAINST('O\'' IN BOOLEAN MODE)
这一行:
ORDER BY MATCH(ObjectSearchData) AGAINST('*O\'*' IN BOOLEAN MODE) DESC
在 BOOLEAN
模式下没有任何意义,所有行都有 MATCH = 1
关于MySQL MATCH AGAINST 使用通配符返回带有撇号的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28989095/