Elasticsearch复杂邻近查询

Van*_*yen 5 filter proximity elasticsearch

鉴于我有如下查询:

council* W/5 (tip OR tips)

上述查询可以翻译为:查找任何具有理事会*(提示或提示)不超过5个单词的内容.

所以下面的文字将匹配:

  • 谢尔哈伯市议会提示
  • 理事会最佳提示
  • 理事会十大提示

但是这个不应该匹配:

  • ... 谢尔哈伯市议会.根本没有任何好的提示.

我需要帮助来为此构建一个elasticsearch查询.我在考虑正则表达式查询,但我不太确定更好的替代品.谢谢

Aks*_*hay 6

您可以结合使用span_near查询,span_multispan_or.我们可以使用下面的查询来执行相同的搜索.

{
  "query": {
    "span_near": {
      "clauses": [
        {
          "span_multi":
          {
            "match":
            {
              "prefix": { "text": "council"}
            }
          }
        },
        {
          "span_or": {
            "clauses": [
              {
                "span_term": {
                  "text": {
                    "value": "tip"
                  }
                }
              },
              {
                "span_term": {
                  "text": {
                    "value": "tips"
                  }
                }
              }
            ]
          }
        }
      ],
      "slop": 5,
      "in_order": true
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

需要注意的重要事项是span_term,它是您搜索的文本.在这个例子中,我只有一个名为"text"的字段.趿拉指示的话,我们将允许术语之间的数量,并in_order表示单词的顺序很重要.所以"小组委员会"不会匹配,"理事会小费"将在哪里.