【问题标题】:LIKE condition in SphinxQLSphinxQL 中的 LIKE 条件
【发布时间】:2017-05-01 04:33:11
【问题描述】:

亲爱的程序员和 IT 专家,我需要你的帮助。我刚刚开始研究什么是狮身人面像。我什至提出了自己的“谷歌建议”,以修复频繁和常见的人工搜索输入错误。问题是,它总是试图修复错误并中断真正的输入。 嗯,我希望搜索引擎首先尝试通过子字符串在搜索字段中找到一致性,而不是如果没有找到一致性,而不是使用我的逻辑来修复错误。言简意赅的话,我要sphinx,首先执行这个SQL等效命令

SELECT * FROM suggest WHERE keyword LIKE('%$keyword%')

如果没有找到,继续修复错误。 主要问题是....是否可以告诉 spinx 通过子字符串搜索?

【问题讨论】:

    标签: search-engine sphinx


    【解决方案1】:

    Sphinx 基本上可以做到这一点,但需要了解它是如何工作的。 Sphinx 索引单个单词,并按关键字匹配。它使用大型倒排索引来快速查询(而不是运行子字符串匹配)

    所以可以将MATCH('one two') 做为查询,它会匹配一个包含“...一二...”的文档,但顺序无关紧要,其他词也可以出现,ALSO 也可以match '... 二三一 ...' 这不会发生在 mysql LIKE 中(它是一个纯子字符串匹配)

    可以使用短语运算符来做到这一点MATCH('"one two"')

    此外,Sphinx 默认匹配整个单词。所以MATCH('one two') 只会匹配这两个作品。它不会匹配一个文档说“... one twotwentyone ...”,而 LIKE 不限于整个单词。

    因此可以使用通配符来允许部分匹配。 MATCH('"*one two*"') --- 还需要在索引上使用min_infix_len 配置启用它!

    更重要的是,狮身人面像不索引标点符号等(默认为charset_table),所以一个文档说'......一个! (两个?)...' 仍将匹配 MATCH('"one two"')。 SQL like 不会忽略这一点。

    您可以更改 sphinx 以索引更多标点符号(通过 charset_table)以更接近子字符串匹配。

    所以SELECT * FROM index WHERE MATCH('"*$keyword*"') 可能是最接近原始查询的狮身人面像查询(即子字符串匹配)。只要你意识到差异。还有要考虑的 MySQL 排序规则,它们与 charset_table 不完全相同。

    (坦率地说,虽然这是正确的。我想知道是否有点 OTT。如果您只有一个想要搜索的文本语料库,您可以正常索引它。然后通过 CALL KEYWORDS() 运行查询,以了解是否查询是索引中的有效单词(即只是告诉您给定单词在索引中出现的次数)。然后可以运行您的算法来修复错误)

    作为旁注,斯芬克斯确实有一个内置的建议系统 http://sphinxsearch.com/blog/2016/10/03/2-3-2-feature-built-in-suggests/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多