我正在尝试以最快的方式提出搜索建议。起初我认为 Levenstein UDF 函数与 mysql 表相结合就可以完成这项工作。但是使用 levenshtein,mysql 将不得不检查表中的每一行(大量的单词),这会使查询变得非常慢。
现在我最近安装并开始使用 Sphinx ( http://sphinxsearch.com/ ) 进行全文搜索,主要是因为它的性能和 mysql 与 SphinxSE 的紧密集成。
所以我问自己是否可以使用 sphinx 实现“你的意思是”算法以某种方式提高性能,我想我找到了一个简单的算法。基本上我把所有我想更正的关键字,在每个字母之间放一个空格,然后把它放在狮身人面像索引中。如果这个词是'keyword',它就变成'keyword d'。现在,当用户输入一个单词时,我将其拆分为字母并在 sphinx 索引中搜索与提供的任何字母匹配的记录(我只需要一个)。最好的部分是 sphinx 在计算匹配行的相关性(权重)方面非常好,所以最好的匹配总是有最大的权重(我认为)。它还考虑了单词(在我的情况下为字母)位置,因此最佳匹配将按该顺序排列。
通过 sphinx 查询,我在关键字列表中得到了最相似的词。然后我使用扩展的 Levenshtain 距离用 php 检查它,该距离占重新排列的字母https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance。如果字符串距离小于 2(并且 != 0),则建议该词。否则不要提出任何建议。
我的想法有问题吗?有什么我没想到的?sphinx 查询的任何预期故障,以及不会给出最佳匹配的 sphinx 相关性计算的怪癖?如果我在某个地方弄错了,请纠正我。