带有 multi_match 的 Elasticsearch 过滤器

Bis*_*ard 2 filter elasticsearch

我正在尝试在 ElasticSearch 中编写一个查询,我将 multi_match 与过滤器结合使用,以获取 id 或数字 og id。

这是我到目前为止:

{
    "query": {
        "bool": {
            "must": {
                "multi_match": {
                    "query": "Kasper",
                    "fields": ["name", "first_name", "last_name"]
                }
            },
            "filter": {
                "term": {
                    "user_id": "ea7528f0-1b8a-11e8-a492-13e39bbd17cb"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

查询的“必须”部分完美运行,当我单独运行它时,我得到两个结果。当我从两个结果之一中挑选出“user_id”并使用该 id 添加查询的“过滤器”部分时,我什么也没得到。

我真正想做的是在 SQL 中使用类似的东西,其中 user_id in ('id1', 'id2'),因此过滤将类似于:

...,
"filter": {
    "terms": {
        "user_id": ["ea7528f0-1b8a-11e8-a492-13e39bbd17cb"]
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里误解了什么吗?

Pio*_*ski 7

我猜这是因为user_idfield 被视为 atext并被分析。你应该keyword在这种情况下使用type (你只需要改变 field.map 的映射user_id

另一种方式(如果您是在Elasticsearch 5+),你可以在搜索keyword。只需尝试使用以下查询:

{
  "query": {
    "bool": {
      "must": {
        "multi_match": {
          "query": "Kasper",
          "fields": ["name", "first_name", "last_name"]
        }
      },
      "filter": {
        "term": {
          "user_id.keyword": "ea7528f0-1b8a-11e8-a492-13e39bbd17cb"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我只在您的查询中更改"user_id""user_id.keyword"