【问题标题】:elasticsearch: phrase search for two adjacent words in any order (analyzed)elasticsearch:以任意顺序对两个相邻单词进行词组搜索(已分析)
【发布时间】: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_phraseslop 查询时,我可以使用"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


【解决方案1】:

首先通过对_analyze API 的显式请求运行查询,然后是span_near 查询?

【讨论】:

  • 感谢您的解决方法。如果不可能在单个查询请求中执行此操作,我可能会显式使用分析器
  • 我的应用程序中有一组固定的查询是从关系数据库中获取的数据生成的。所以我可以只分析一次所有字符串,然后从数据库中获取分析后的词条进行span_near 查询。
  • 另一种解决方法。也许在事先不知道查询时出于性能原因,最好在单个查询中查询两个变体:"WordToBeAnalyzed1 WordToBeAnalyzed2""WordToBeAnalyzed2 WordToBeAnalyzed1"(需要测试来证明这一点)。但在我的情况下(见之前的评论)。
【解决方案2】:

这会起作用。

{
"query":{
    "bool":{
        "must":[
            {
                "query_string":{
                    "query":"*hello* *there*",
                    "fields":[
                        "subject"
                    ],
                    "default_operator":"and",
                }
            }]
      }
  }
}

【讨论】:

  • 感谢您对 StackOverflow 的贡献。你的回答可能很好。不过,一些解释会很好,请参阅here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多