2016-06-28 12 views
1

何らかの種類の条件付きロジックを使ってドキュメントをフィルタリングする必要がありますが、私はこれを実行できません。弾性検索条件フィルタ

私の文書は、このようなものです: {type: 'A'} {type: 'B', foo: ['bar']} {type: 'B', foo: []}

今私はfooが空であるtype「B」の全ての文書をフィルタリングする必要があります。 擬似コードでは、クエリは次のようになります。 if(type == 'B' && foo == []) { // filter out this document } 私のメイン・クエリは次のようになります。私は理解している場合 query: { filtered: { query: { bool: { must: { match_all: [] } } }, filter: { bool:{ must_not: { term: {'_hidden': true} } } } } } Elasticsearchバージョンは1.5.0

+0

Elasticsearchは空のフィールドを保存しません。私は存在しないフィールドについて話していると思いますよね?あなたはmust_notの中に存在するフィルタを使用できますか? https://www.elastic.co/guide/en/elasticsearch/reference/1.4/query-dsl-exists-filter.html 試しましたか? –

+0

こんにちは@WaldemarNeto。はい、私は 'exists'フィルタと' missing'フィルタを使用しようとしました。 これは、タイプ 'B'のすべての文書に対して機能します。それは決して "プロパティ" fooがないので、タイプ 'A'のすべてのドキュメントもフィルタリングします。 –

+0

タイプ== "A" fooは問題ではない、と理解していますか? == "B"と入力した場合、fooは空である必要がありますか? –

答えて

0

で、それはありますか? タイプ== aの場合、aを持つすべての文書が返されます。 タイプ== bで、フィールドfooが存在しない場合、戻ります。意味がありますか?

{ 
    "query": { 
     "filtered": { 
     "query": { 
      "match_all": {} 
     }, 
     "filter": { 
      "bool": { 
       "should": [ 
        { 
        "term": { 
         "type": "a" 
        } 
        }, 
        { 
         "bool": { 
          "must": [ 
          { 
           "term": { 
            "type": "b" 
           } 
          } 
          ], 
          "must_not": [ 
          { 
           "missing": { 
            "field": "foo" 
           } 
          } 
          ] 
         } 
        } 
       ] 
      } 
     } 
     } 
    } 
} 
+0

私はfooフィールドが見つからないタイプbの文書を除外したいと思います。 –

+1

それは正しいです。さらに、私は他の文書の種類については本当に気にしません。さまざまな種類があります。私が望むのは、 'foo'がないタイプ 'B'の文書を除外することだけです。 –

+0

今見てください:) –