Elasticsearch复杂邻近查询

时间:2014-03-04 03:26:24

标签: filter elasticsearch proximity

鉴于我有如下查询:

council* W/5 (tip OR tips)

上述查询可以翻译为:查找任何理事会* (提示或提示)相隔不超过5个字的内容。

以下文字将匹配:

  • 谢尔哈伯城理事会提示
  • 理事会最佳提示
  • 理事会前10名提示

但是这个不应该匹配:

    谢丽尔堡的
  • ......城市理事会。根本没有任何好的提示

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

1 个答案:

答案 0 :(得分: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
    }
  }
}

需要注意的重要事项是 span_term ,这是您搜索的文字。在这个例子中,我只有一个名为“text”的字段。 Slop 表示术语之间允许的单词数, in_order 表示单词的顺序很重要。因此,“小组委员会”将不会匹配,“理事会小费”将在那里。