我正在尝试想出最快的方法来提出搜索建议。起初我认为 Levenstein UDF 函数与 mysql 表相结合就可以完成这项工作。但是使用 levenshtein,mysql 必须遍历表中的每一行(大量的单词),这会使查询非常慢。
现在我最近安装并开始使用Sphinx(http://sphinxsearch.com/)用于全文搜索,主要是因为它的性能以及 mysql 与 SphinxSE 的紧密集成。
所以我问自己是否可以使用 sphinx 实现一种“你的意思是”算法来以某种方式提高性能,我想我找到了一个简单的算法。
基本上我采取了所有我想要纠正的关键字,在每个字母之间放置一个空格,然后将其放入 sphinx 索引中。如果这个词是“关键词”,它就变成“关键词”。现在,当用户输入一个单词时,我将其拆分为字母,并在 sphinx 索引中搜索与所提供的任何字母相匹配的记录(我只需要一个)。最好的部分是 sphinx 非常擅长计算匹配行的相关性(权重),因此最佳匹配始终具有最大的权重(我认为)。它还考虑了单词(在我的例子中是字母)的位置,因此最佳匹配将按该顺序排列。
通过 sphinx 查询,我在关键字列表中获得了最相似的单词。然后我用 php 使用扩展的 Levenshtain 距离来检查它,该距离解释了重新排列的字母https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance。如果字符串距离小于 2(并且!= 0),则建议该单词。否则不要建议任何事情。
我的想法有问题吗?有什么我没想到的吗? sphinx 查询是否会出现任何预期的故障,以及 sphinx 相关性计算是否会出现无法给出最佳匹配的怪癖?如果我有什么地方弄错了,请纠正我。
我看不出你的想法有什么问题。大胆试试吧。只是指出,只有当您想覆盖与 LD 非常相似的内置行为时,您的方法才相关。
例如,对于 sphinx 1.10-beta,您可以指定 min_infix_len 和 Expand_keywords 并使用 sphinx 的内置加权方法(BM25 和一些专有代码)以获得良好的结果。http://sphinxsearch.com/blog/2010/08/17/how-sphinx-relevance-ranking-works/
不要忘记对这些查询进行内存缓存,并创建一个预热脚本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)