【问题标题】:Sphinx and "did you mean ... ?" suggestions idea. WIll it work?斯芬克斯和“你是说……?”建议想法。它会起作用吗?
【发布时间】:2011-02-14 20:13:41
【问题描述】:

我正在尝试以最快的方式提出搜索建议。起初,我认为 Levenstein UDF 函数与 mysql 表相结合就可以完成这项工作。但是使用 levenshtein,mysql 将不得不遍历表中的每一行(大量单词),这会使查询变得非常慢。

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

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

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

我的想法有问题吗?有什么我没想到的? sphinx 查询的任何预期故障,以及不会给出最佳匹配的 sphinx 相关性计算的怪癖?如果我在某个地方弄错了,请纠正我。

【问题讨论】:

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


    【解决方案1】:

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

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

    不要忘记对这些查询进行内存缓存,并创建一个预热脚本。

    【讨论】:

    • 谢谢,有时间我会进一步研究的。
    【解决方案2】:

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

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

    您可以选择这样的建议:

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

    如果顶部结果中的 count 在该关键字的所有查询中占很大比例,则显示一条消息。

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

    【讨论】:

      【解决方案3】:

      我认为阅读 Andrew Aksyonoff(Sphinx 的作者)对通过 Sphinx 执行此任务的看法会很有趣 - http://habrahabr.ru/blogs/sphinx/61807/(使用翻译器从俄语翻译)

      【讨论】:

      • 我已经读过,我的问题是我的想法会按预期工作,还是我没有考虑到某些事情。 (顺便说一句,我对俄语有基本的了解,所以不需要翻译):)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2013-10-05
      • 2012-07-22
      • 1970-01-01
      相关资源
      最近更新 更多