【发布时间】:2014-09-04 18:20:19
【问题描述】:
问题是通过单词分析以任意顺序对两个相邻单词进行短语搜索。
例如在Sphinx extended syntax terms 中,查询字符串可以写成WordToBeAnalyzed1 NEAR/1 WordToBeAnalyzed2。然后对这两个词进行分析,搜索引擎会找到“Word1 Word2”或“Word2 Word1”,这两个词可以是任何形式(例如“fox jumps”、“jumping fox”、“foxes jumped”等)。
阅读 ES 文档我无法在 ES 查询 DSL 中表达相同的搜索。
使用match_phrase 和slop 查询时,我可以使用"slop": 2 参数查询短语"WordToBeAnalyzed1 WordToBeAnalyzed2" 到match same words in reverse order。但它也会匹配“Word1 SlopWord1 Word2”和“Word1 SlopWord1 SlopWord2 Word2”等不受欢迎的变体。
我也尝试使用带有in_order 参数的span_near 查询,但是
span queries are term-level queries, so they have no analysis phase
如果有人能指出解决这个问题的方法,我会很高兴。
【问题讨论】:
-
我一直无法以“正确”的方式解决这个问题。我们过去曾使用过几种变通方法来模仿这一点。一种是在另一个字段(如伪分析器)中对短语中的标记进行排序,并在搜索时应用相同的排序。另一种是将令牌存储为数组并进行术语查询。
-
@coffeeaddict 谢谢,但看起来我无法正确理解您的解决方法,或者我们正在尝试解决不同的问题。对索引字符串中的标记进行排序,例如“word2 word4 word1 word3”将产生按下一个顺序索引的术语:“word1 word2 word3 word4”。假设需要以任何单词顺序查询短语
"word4 word1"。建议的分析器将查询更改为"word1 word4",但问题是索引文本中的“word1”和“word4”有2个单词的距离,因此查询会失败。您如何考虑使用term查询的单词顺序? -
是的,你是对的。我应该首先要求澄清您的要求:(我曾认为您尝试进行的短语匹配类型涉及索引短语和搜索短语之间相同数量的标记(只是顺序不同)。您可能仍然可以如果您仅在一个方向进行短语匹配,则进行术语查询。如果您的搜索词比索引词短,您可以查询将 minimum_should_match 设置为搜索词中的标记数的词。如果出现以下情况,此模型将失败搜索词比索引词长
-
@coffeeaddict 不理解您的建议。您建议将术语查询与短语匹配一起使用?您能否提供您提供的查询的简短说明?谢谢!
标签: search elasticsearch full-text-search sphinx