2014-06-12 65 views
0

我想做一个ElasticSearch查询,在它的过滤器中获取一个参数,有时这个参数是一个单一的值,有时它是一个值列表,I知道当它是一个单一的值时,我应该使用“术语”,当它是一个列表时,我应该使用“术语”。但我想要一个可以处理这两件事的查询,并将其传递给一个值或一个列表,并返回结果。 [全是一个查询],你有什么想法如何做到这一点?ElasticSearch查询一次过滤一个值和一个值列表

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

查询列表:

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

,但我想一个查询处理两种。

回答

1

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

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

更多的例子,看看https://github.com/rcullito/elasticSearchQueries

0

您可以使用一个术语查询同时处理,因为你可以在一个单一值的列表。

例如:

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

注意,bool没有延伸到各个值中的任何名单。我想通过扩展AND逻辑的唯一方法是对每个单独的值使用term query。 (这可能看起来像首先需要很多时间,但bool高速缓存过滤器,所以它会在稍后标记TrueFalse

相关问题