2017-04-05 5 views
0

フィールドに整数の配列が含まれている状況があります。私は、だけがこの配列に値のセットを含む文書をフィルタリングするクエリを実装する必要があります。例えばElasticSearch:配列フィールド内の値がリストにない文書をフィルタリングする

、私は次のインデックス作成と言う:

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

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

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

今、私は「foo」が[2,4]でないいずれかの値が含まれているすべての文書を取得したいと思います。私はids1と3を返す文書を持っていたい。ドキュメント1に値2が含まれているわけではなく、他の値も含まれています。このような単純なmust_notは、文書1除外します:上記のクエリのみ文書3と一致します

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

を、文書1が含まれるように、これを書き換える方法はありますか?

+0

ですから、[2,4]他のすべてと「または」-search(論理和)に類似するために、結果にしたいですフィールド 'foo'の値は? –

+0

2または4でない値がfooに含まれているドキュメントを結果に含めたいと思います.2または4も存在する可能性がありますが、少なくとも1つの他の値が存在する必要があります。 – 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]} 
          } 
         } 
        } 

       } 
      } 
     } 
    } 
} 
関連する問題