时间:2011-02-14 20:13:41

标签: mysql sphinx keyword levenshtein-distance search-suggestion

我正在努力想出最快的搜索建议方法。起初我认为Levenstein UDF函数结合mysql表可以完成这项工作。但是使用levenshtein,mysql必须遍历表中的每一行(大量单词),这会使查询变得非常慢。

现在我最近安装并开始使用Sphinx(http://sphinxsearch.com/)进行全文搜索,主要是因为它的性能和与SphinxSE的紧密mysql集成。

所以我问自己是否可以使用sphinx以某种方式实现“你的意思”算法以提高性能,我想我发现了一个简单的算法。 基本上我采取我想要纠正的所有关键字,在每个字母之间放一个空格,然后将它放在sphinx索引中。如果单词是'keyword',它就变成了'k e y w o r'。现在,当用户输入一个单词时,我将其拆分为字母,并在sphinx索引中搜索与所提供的任何字母匹配的记录(我只需要一个)。最好的部分是狮身人面像非常适合计算匹配行的相关性(权重),因此最佳匹配总是具有最大权重(我认为)。它还会考虑单词(我的情况下的字母)位置,因此最佳匹配将按此顺序进行。

通过sphinx查询,我在关键字列表中得到了最相似的单词。然后我使用扩展的Levenshtain距离来检查它,该距离考虑了重新排列的字母http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance。如果字符串距离低于2(和!= 0),则建议单词。否则不要提出任何建议。

我的想法有问题吗?我没想到的东西?任何预期的sphinx查询故障,以及与sphinx相关性计算的怪癖都没有给出最佳匹配?如果我在某处误会,请纠正我。

3 个答案:

答案 0 :(得分:3)

我看不出你的想法有问题。去吧。只是要指出,只有在想要覆盖与LD非常相似的内置行为时,您的方法才有意义。

例如,使用sphinx 1.10-beta,您可以指定min_infix_len和expand_keywords并使用sphinx的内置加权方法(BM25和一些专有代码)以获得良好的结果。 http://sphinxsearch.com/blog/2010/08/17/how-sphinx-relevance-ranking-works/

不要忘记记忆这些查询,并创建一个预热脚本。

答案 1 :(得分:0)

我认为阅读Andrew Aksyonoff(Sphinx的作者)通过Sphinx({3}}(使用翻译器翻译俄语)来实现这项任务的想法会很有趣。

答案 2 :(得分:0)

您只需记录输入的每个搜索查询,以及用户输入的下一个搜索查询。

让我们假设很多用户搜索的是rhinosorous但实际上是指犀牛。因为用户会更正他们的查询,这意味着将会有很多以rhinoceros作为下一个查询的犀利查询。

您可以选择以下建议:

SELECT id, query, next_query, COUNT(id) AS count FROM queries GROUP BY query ORDER BY COUNT(id) DESC

如果最高结果的count占该关键字所有查询的百分之高,则会显示一条消息。

我没有测试过这个,这只是一个想法。