ElasticSearch查询一次过滤单个值和值列表

时间:2014-06-12 17:27:13

标签: elasticsearch

我想创建一个ElasticSearch查询,在其过滤器中获取一个参数,有时这个参数是单个值,有时它是一个值列表,我知道当它是单个值时我应该使用“term”当它是一个列表时,我应该使用“术语”。但我想要一个可以处理这两件事的查询,我将它传递给一个值或一个列表,然后返回结果。 [所有查询],您对如何做到这一点有任何想法吗?

query for single value:    
{'filter': {
          'and': [
                  {'term': {'first': 1}},
                  {'term': {'second': 1}},
                 ]
        },
 }

查询列表:

{'filter': {
          'and': [
                  {'terms': {'first':  [1,2,3]}},
                  {'terms': {'second': [1,2,3]}},
                 ]
        },
 }

但我想要一个查询来处理它们。

2 个答案:

答案 0 :(得分:1)

使用带有“should”键的布尔查询将导致返回与任一子句匹配的文档。

{
  "filter": {
    "bool": {
      "should": [
        {
         "terms": {
           "first": "[1, 2]"
          }
        },
        {
          "terms": {
           "second": "[2, 3]"
          }
        }
      ]
    }
  }
}

有关更多示例,请查看https://github.com/rcullito/elasticSearchQueries

答案 1 :(得分:0)

您可以使用术语查询来处理两者,因为您可以在其中包含一个包含单个值的列表。

例如:

{
    "query" : {
        "filtered" : {
            "filter" : {
                "bool" : {
                    "must" : [
                        { "terms" : { "field1" : ["a"] } },
                        { "terms" : { "field2" : ["b", "c"] } }
                     ]
                 }
             }
        }
    }
}

请注意,bool不会扩展到任何列表中的各个值。我想通过扩展AND逻辑的唯一方法是为每个单独的值使用term query。 (这可能看起来一开始会花费很多时间,但bool会缓存过滤器,以便稍后标记为TrueFalse