2017-08-02 16 views
0

私は、文書の構造を以下している:記事:ElasticSearch:ネストされた文書による複雑なフィルタ

{ 
    product_name: "Product1", 
    product_id: 1, 
    ..., 
    articles: [ 
     { 
      article_name: 'Article 101', 
      id: 101, 
      some_param: 10, 
      clients: [] 
     }, 
     { 
      article_name: 'Article 102', 
      id: 102, 
      some_param: 11, 
      clients: [ 
       { 
        client_id: 10001, 
        client_name: "some client 1001" 
       } 
       ... 
      ] 
     } 
    ] 
}, 

{ 
    product_name: "Product2", 
    product_id: 2, 
    ..., 
    articles: [ 
     { 
      article_name: 'Article 101', 
      id: 101, 
      some_param: 10, 
      clients: [] 
     }, 
     { 
      article_name: 'Article 102', 
      id: 102, 
      some_param: 10, 
      clients: [ 
       { 
        client_id: 10001, 
        client_name: "some client 1001" 
       } 
       ... 
      ] 
     } 
    ] 
} 

私はその記事の一部は2つの条件を(単一記事は両方の条件と一致する必要があります)と一致する場合にのみ文書(製品)を取得する必要があります.some_param = 10001

= 10とarticles.clients.client_idだから私は、私が間違っていた、今、このクエリを使用しています(と私は理由を知っている)ID 2.

で唯一の製品を取得する必要があり、なぜなら両方のドキュメントを取得します:

articles.some_param = 10 AND articles.clients.client_id = 10001

例えば、:私は両方の条件に合致する少なくとも1件の記事を持ってのみ製品を取得するクエリを作成するにはどうすればよい

{ "query": { "bool": { "filter": [ { "term": { "articles.clients.id": 10001 } }, { "terms": { "articles.some_param": 10 } } ] } } } 

ID 2の製品のみを入手するには?このような

+0

あなたが望むように機能するには、ネストされたタイプが必要です。 https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html – khachik

+0

これらはすでにネストされたタイプとして設定されています。この問題はネストされた型には関係しないと私は考えている。上記のクエリは必要に応じて動作しますが、要件に合わない場合があります。 "articles.some_param = 10 AND articles.clients.client_id = 10001") – Teimuraz

答えて

1

何か:

{ 
"query": { 
    "nested": { 
    "path": "articles", 
    "query": { 
     "bool": { 
     "must": [ 
       { 
       "term": { 
        "articles.some_param": { 
         "value": 10 
         } 
        } 
       }, 
       { 
       "nested": { 
        "path": "articles.clients", 
         "query": { 
          "term": { 
           "articles.clients.id":{ 
           "value": 10001 
          } 
         } 
         } 
        } 
       } 
      ] 
     } 
     } 
    } 
    } 
} 

UPDATE: ブール値に2番目のクエリをラップ試してみてください。

{ 
"query": { 
    "nested": { 
    "path": "articles", 
    "query": { 
     "bool": { 
     "must": [ 
       { 
       "term": { 
        "articles.some_param": { 
         "value": 10 
         } 
        } 
       }, 
       { 
       "bool":{ 
        "must" : [ 
        { 
        "nested": { 
        "path": "articles.clients", 
         "query": { 
          "term": { 
           "articles.clients.id":{ 
           "value": 10001 
          } 
         } 
         } 
        } 
        } 
        ] 
       } 
       } 
      ] 
     } 
     } 
    } 
    } 
} 

p.s.私は2番目のネストされたクエリでパスと間違えられる可能性があります。ちょうどチェックできませんでした。したがって、2番目のクエリのパスを使いこなすことができます。

p.p.s.フィルタは必要なクエリではありません。スコアを計算しません

+0

これは動作しません。私はまだこのクエリで両方の製品を取得します。 2番目だけを取得する必要があります – Teimuraz

+0

2番目のネストされたクエリをboolクエリでラップすることができます。私は更新し、あなたが見ることができます。あなたの地図を見るのは良いことです。 – SouXin

+0

ありがとうございました! (私は得点を計算する必要はありません) – Teimuraz

関連する問題