【发布时间】:2019-08-01 16:31:20
【问题描述】:
我正在使用 MYSQL 的全文搜索功能(在 Mysql 5.6.33 中)。
如果我在 NATURAL LANGUAGE 模式下进行 MATCH,对于带有一个字符拼写错误的邮政编码,我会得到一些不错的结果,包括使用“正确”邮政编码的结果,但它们不在顶部附近。
例如,有 10 所学校的邮政编码为 "BN2 1TL"。我故意把它拼错为"BN2 1TM" 并进行如下搜索:
SELECT record_id, address_string,
MATCH (address_string) AGAINST ("BN2 1TM" IN NATURAL LANGUAGE MODE) AS score
FROM schools
WHERE MATCH (address_string) AGAINST ("BN2 1TM" IN NATURAL LANGUAGE MODE) > 0
ORDER BY score DESC;
仔细观察,这是因为搜索已经回购了所有在其address_string 列中具有"BN2" 或"1TM" 的结果,并且它们都具有完全相同的分数,因此是随机顺序的,有效. .
这是完全合理的行为,但如果我能得到考虑“亲密度”的分数,那就太好了,这意味着,对于在 "BN2 1TM" 上的搜索,"BN2 1TL" 的得分将高于 @987654332 @。有没有办法做到这一点?
编辑:我记得这种接近在技术上称为“Levenshtein 距离”,它是对Levenshtein algorithm 的引用,用于确定将一个字符串转换为另一个字符串需要多少替换。所以我想我的问题可能是 “我可以通过 MYSQL FULLTEXT NATURAL LANGUAGE MODE 评分来考虑 Levenshtein 距离”?
【问题讨论】:
-
有趣的问题。如果您解释为什么要放弃 Lucene 而使用 MySQL FULLTEXT,这可能会对我们有所帮助。大多数遇到像您这样的问题的人在遇到像您这样的问题时会放弃 MySQL 转而使用 Lucene。请edit您的问题。
-
@O.Jones 我并不是要粗鲁,但实际上我更希望 not 讨论一下我使用 MySQL FULLTEXT 的动机,因为它不是与问题相关。
-
@O.Jones 我已经删除了对 Lucene 的引用,因为它可能(并且确实显然)分散了问题的重点。
-
你需要levenshtein distance,然后你就可以下单了。
-
@vivek_23 我刚刚在编辑中说了同样的话,很有趣。我想我需要按 MATCH 分数排序,然后是 Levenshtein 函数。这在MYSQL中是否存在?
标签: mysql pattern-matching full-text-search levenshtein-distance