2014-06-12 104 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

相關問題