问题描述
我们的数据库包含许多标题中带有逗号的条目(如在匈牙利语中,它是小数点分隔符而不是句点),并且希望匹配具有正确相关性的条目。如果用户输入的术语是 7,5x20 otherTerm
,则搜索 sql 当前看起来像这样SELECT (MATCH(title) AGAINST('(+7,5x20* +otherTerm* ) (7,5x20* otherTerm* ) (+7,5x20 +otherTerm )' IN BOOLEAN MODE)) AS Relevance,id,title,product_id FROM versions
WHERE (MATCH(title) AGAINST('(+7,5x20 +otherTerm )' IN BOOLEAN MODE))
ORDER BY Relevance DESC LIMIT 50
现在结果顺序给出了更高的相关性,例如。 5x20 比 7,5x20 所以必须对逗号进行某种字符转义,防止 MysqL 将它们作为分隔字符串处理。我没有找到合适的。
提前感谢您的帮助。
编辑:目前无法将标题分解为更易消化的数据。真的在寻找转义逗号或用“匹配任何单个字符”运算符(如正则表达式中的点)替换它的解决方案。
解决方法
FULLTEXT
索引不是为处理数字而设计的,无论数字的区域设置如何。
一种方法是更改传入文本以将您想视为“字母”的标点符号替换为 _
。 (并建立一个单独的列来存储这个修改过的文本。然后向其中添加 FULLTEXT
索引而不是“真实”文本。)
请注意,+x
会以一种糟糕的方式失败——一个字符串没有被索引,因此无法找到它们。因此,包含两个短的字符串会导致返回零匹配。
对保存的文本(例如 7_5x20
)的更改也需要应用于搜索。
50K 行?编写一个特殊的一次性脚本来对现有的 50K 行执行上述转换。然后将转换合并到 INSERT 和 SELECT 中。