2017-04-05 61 views
0

我有一種情況,其中包含整數數組的字段。我需要能夠實現一個查詢,該查詢過濾掉包含的文檔,只有這個數組中的一組值。ElasticSearch:篩選數組字段中的任何值不在列表中的文檔

例如,假設我創建了以下指標:

PUT /test/stuff/1 
{ 
    "foo": [1,2,3] 
} 

PUT /test/stuff/2 
{ 
    "foo": [2] 
} 

PUT /test/stuff/3 
{ 
    "foo": [1,3] 
} 

現在我想獲得的所有文件,其中「富」包含不在[2,4]的任何值。我想要返回帶有ID 1和3的文檔。並非文檔1包含值2,但也包含其他值。一個簡單的must_not這樣會過濾掉一些文件1:

POST /test/stuff/_search 
{ 
    "query": { 
     "bool": { 
      "must" : { 
       "match_all": {} 
      }, 
      "filter" : { 
       "bool": { 
        "must_not": [ 
         { 
          "terms" : {"foo" : [2,4]} 
         } 
        ] 
       } 
      } 
     } 
    } 
} 

上面的查詢將只匹配文件3.有沒有辦法改寫這也包括文檔1?

+0

所以,你要對結果[2,4]類似於「或」 - 搜索(析取)與所有其他字段'foo'的值? –

+0

我希望結果包含foo包含任何不是2或4的值的文檔。2或4也可以存在,但至少有一個其他值必須存在。 – Alex

回答

2

這是可行的一個腳本查詢,用painless說明如下:

{ 
    "query": { 
     "bool": { 
      "must" : { 
       "match_all": {} 
      }, 
      "filter" : { 
       "bool": { 
        "must": { 
         "script" : { 
          "script" : { 
          "inline" : "for(int i: doc['foo']) { boolean matches = true; for(int j: params.param1){if(i==j) matches = false;} if(matches) return true;} ", 
          "lang" : "painless", 
          "params" : { "param1": [2,4]} 
          } 
         } 
        } 

       } 
      } 
     } 
    } 
} 
相關問題