2017-08-08 19 views
1

と仮定、ElasticSearch 5で、私はネスティングなどでデータを持っている:ElasticSearchでは、結果にネストされたドキュメントをどのようにフィルタリングしますか?

{"number":1234, "names": [ 
    {"firstName": "John", "lastName": "Smith"}, 
    {"firstName": "Al", "lastName": "Jones"} 
]}, 
... 

そして私は数1234のヒットを照会したいが、「lastNameの」一致のみ名を返す:そう、「ジョーンズ」私の結果は、一致しない名前を省略します。言い換えれば、用語クエリなどに基づいて、一致する文書の一部分だけを返信したいと思っています。

単純なネストされたクエリは、トップレベルの結果をフィルタリングするため、実行しません。何か案は?

{ "query" : { "bool": { "filter":[ 
    { "term": { "number":1234} }, 
    ???? something with "lastName": "Jones" ???? 
] } } } 

私は戻ってほしい: - これはまったく同じ文書あなたにある

hits: [ 
    {"number":1234, "names": [ 
    {"firstName": "Al", "lastName": "Jones"} 
    ]}, 
    ... 
] 
+1

2番目の回答は、必要なものを手に入れるでしょうか? – Val

+0

目的に合った良い解決策を見つけましたか?あなたが下にコメントしたので、受け入れられた答えは解決しないようです。ネストされたオブジェクトに対しても全く同じフィルタリングが必要ですが、これらの内部ヒットは別々に返され、ネストされたオブジェクトリスト全体も返されます。ネストされたオブジェクトでは不可能なのでしょうか?親子になったのですか?私の質問もここで見てください。https://stackoverflow.com/questions/48750696/how-to-filter-nested-objects-on-a-should-query – batmaci

+0

私は欲しかったものを正確に見つけられませんでした。もし私が弾力性を担当していたなら、おそらくこの機能を追加するでしょう! –

答えて

2

hitsセクションを使用し、この

{ 
    "query": { 
     "filtered": { 
     "query": { 
      "match_all": {} 
     }, 
     "filter": { 
      "bool": { 
       "must": [ 
        { 
        { "term": { "number":1234} } 
        }, 
        { 
        "nested": { 
         "path": "something", 
         "filter": { 
          "term": { 
           "something.lastName": "Jones" 
          } 
         }, 
         "inner_hits" : {} 
        } 
        } 
       ] 
      } 
     } 
     } 
    } 
} 

のようなものを試してみては_sourceを返しますインデックスに登録されていますそれのいくらかの部分。
ネストされたクエリフィルタのトップレベルの結果ですが、inner_hitsを指定すると、内部のネストされたオブジェクトによってこれらのトップレベルのドキュメントが返されたことが表示されます。

{ 
    "query":{ 
     "bool":{ 
     "must":[ 
      { 
       "term":{ 
        "number":{ 
        "value":"1234" 
        } 
       } 
      }, 
      { 
       "nested":{ 
        "path":"names", 
        "query":{ 
        "term":{ 
         "names.lastName":"Jones" 
        } 
        }, 
        "inner_hits":{ 
        } 
       } 
      } 
     ] 
     } 
    } 
} 

は、だから今、トップレベルの文書がまだ返されていますが、一致する名前を持つ追加inner_hitsセクションを持っています。
トップレベルのドキュメントの一部のようなネストされたオブジェクトを脅かす必要があります。 本当にそれらを別々にする必要がある場合は、考慮してください。parent/child relations.

2

が、私はこのRefrence

+0

良いですが、ネストされたコンテンツに基づいてドキュメントをフィルタリングするので、私はまだ私の結果に両方の名前を取得します。 (また、中間の ''クエリ ''を忘れた:{ "bool": '' '' '' '' '' '' 'の中に)' 1234の名前を1つだけ取得できるように文書内でフィルタリングしたい。 –

+0

@Patrick Szalapski。私はinner_hitsをplzの照会に追加します –

+0

あなたが書いたときにそれを実行すると、parsing_exception 'no [query]が3行目に[filtered]に登録されます。中間的な ''クエリ ''を忘れてしまったと思います:{"bool":{''ネストされた ''の内部。また、 ''フィルタリングされた ''は必要ないと思っていますし、 '' bool ''の外側に' 'フィルタ''を置いても構いません。試し続けて、ありがとう! –

0

同様ですが少し違いますが、shouldパラメータを使用して名前の内部ヒットを調べます。トップレベルのドキュメントが返され、inner_hitsはヒットします。

{ 
     "_source": { 
     "excludes": ["names"] 
     }, 
     "query":{ 
      "bool":{ 
      "must":[ 
       { 
        "term":{ 
         "number":{ 
         "value":"1234" 
         } 
        } 
       } 
      ], 
      should: [ 
      { 
       "nested":{ 
        "path":"names", 
        "query":{ 
         "term":{ 
         "names.lastName":"Jones" 
         } 
        }, 
        "inner_hits":{ 
        } 
       } 
      } 

      ] 
      } 
     } 
    } 
関連する問題