MySQL MATCH AGAINST 使用通配符返回带有撇号的意外结果

标签 mysql regex

当用户键入时,我正在执行全文搜索,并且遇到了一个行为不符合我预期的实例。

我在带有全文索引的单列中包含以下数据:

  1. Adrienna O'ROURKE O'ROURKE Adrienna F 1949-04-09 单例小姐 6908

  2. Olivia O'Toole O'Toole Olivia F 1989-06-30 单例小姐 4362

  3. 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/

相关文章:

mysql - 使用左连接 mysql 进行分组 concat 和 sum

php - NOT NULL 值的 SELECT 语句返回 NULL 值。

regex - 如何在 BSD sed 中使用换行符替换?

javascript - 用于验证逗号分隔的唯一数字列表的正则表达式

php - SELECT COUNT() 与 mysql_num_rows();

javascript - PHP 解析 PDO Fetch 为 JSON

php - 使用 PHP 脚本时如何限制 UPDATE

python - 拆分文本,省略大括号中的元素

regex - 非单行 REGEXP

javascript - 正则表达式 - 将用户输入限制为 0-128