mysql - Sphinx 和 "did you mean ... ?"建议思路。它会起作用吗?

标签 mysql sphinx keyword levenshtein-distance search-suggestion

我正在努力想出最快的方法来提出搜索建议。起初我认为结合 mysql 表的 Levenstein UDF 函数可以完成这项工作。但是使用 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/

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

关于mysql - Sphinx 和 "did you mean ... ?"建议思路。它会起作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4996791/

相关文章:

mysql - 使用MySQL删除表中有些重复的记录

mysql - sphinx select 返回空结果但确实存在命中

java - 在 Java 中使用 static 关键字的 5 种方法

MySQL - 按 UNIX_TIMESTAMP 对 1970 年之前的日期进行分组

mysql - 无法在线访问MySQL

python - 如何捕获 _mysql_exceptions.OperationalError : 2002 in python

php - Sphinx 将普通旧索引转换为实时 (RT) 索引

php - 连接到多个数据库

c++ - 函数内部和外部静态变量之间的区别?

java - Java中有goto语句吗?