如何在Elasticsearch中一起组合术语查询和布尔查询

时间:2019-02-27 00:51:35

标签: elasticsearch elasticsearch-dsl elasticsearch-dsl-py

最初,我将在布尔查询中添加一个filter。但是,当我转到terms filter时,documents表示应立即将其替换为terms query。因此,我理解这一点,因为我们需要使用terms querybool query来构造复合查询。如果我是正确的,应该如何编写查询?

注意:我使用elasticsearch的Python API。

1 个答案:

答案 0 :(得分:0)

现在有两种类型的上下文:query context and filter context。查询上下文内的任何查询子句都会对匹配文档的得分做出贡献,即文档与查询的匹配程度,而过滤器上下文内的任何查询子句都会确定文档是否匹配且不影响得分。

因此,在下面的查询中,我已经标记了两个上下文:

{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "field1":   "terms1"}},              <------query context
      ],
      "filter": [ 
        { "terms":  { "someId": [3242, 12343, 1234] }},   <-------inside filter block every query clause will act as filter (filter context)
      ]
    }
  }
}

因此,为了将术语查询用作过滤器,您需要执行以下步骤:

  1. 创建一个布尔查询,例如boolQuery
  2. 创建术语查询termsQuery
  3. termsQuery添加到boolQuery的过滤器中。
  4. boolQuery设置为查询。

这是下面的意思:

{
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "field1": ["terms1", "term2", "terms3"]
          }
        }
      ]
    }
  }
}