2017-09-07 11 views
1

インデックス内の特定の種類のドキュメントを照会しようとしています。 itemsフィールドがnestedフィールドでElasticSearch:正確なネストされた配列を照会する方法

{ 
    "id": 1, 
    "title": "My first Collection", 
    "items": [ 
    { 
     "code": "SB", 
     "order": 1, 
     "random": "something random" 
    }, 
    { 
     "code": "BB", 
     "order": 2, 
     "random": "something random" 
    }, 
    { 
     "code": "FO", 
     "order": 3, 
     "random": "something random" 
    }, 
    { 
     "code": "RA", 
     "order": 4, 
     "random": "something random" 
    }, 
    { 
     "code": "FO", 
     "order": 5, 
     "random": "something random" 
    } 
    ] 
} 

はのは、次のドキュメントを見てみましょう。

私は、正確なパターンに一致するすべての記事を照会したいと思います:

{ 
    "items": [ 
    { 
     "code": "SB", 
     "order": 1 
    }, 
    { 
     "code": "BB", 
     "order": 2 
    }, 
    { 
     "code": "FO", 
     "order": 3 
    }, 
    { 
     "code": "RA", 
     "order": 4 
    } 
    ] 
} 

照会文書はフィールドのこの正確な組み合わせを持つすべてのそれらの4つの項目を持っているでしょう。しかし、彼らはあまりにも多くを持つことができます。上の説明された文書はクエリと一致します。

ドキュメント全体、特にネストされたクエリの部分を検索しましたが、それを動作させる方法が見つかりませんでした。

私自身のアルゴリズム/スクリプトを実装することも可能ですか?

EDIT:

私は成功せず、次のことを試してみました:

{ 
    "query": { 
    "nested": { 
     "path": "items", 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "query_string": { 
       "query": "items.code:SB AND items.order:1" 
       } 
      }, 
      { 
       "query_string": { 
       "query": "items.code:BB AND items.order:2" 
       } 
      }, 
      { 
       "query_string": { 
       "query": "items.code:FO AND items.order:3" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

答えて

1

このクエリは動作します:基本的にあなたが使用したものである

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "nested": { 
      "path": "items", 
      "query": { 
       "bool": { 
       "must": [ 
        { 
        "term": { 
         "items.code": "SB" 
        } 
        }, 
        { 
        "term": { 
         "items.order": "1" 
        } 
        } 
       ] 
       } 
      } 
      } 
     }, 
     { 
      "nested": { 
      "path": "items", 
      "query": { 
       "bool": { 
       "must": [ 
        { 
        "term": { 
         "items.code": "BB" 
        } 
        }, 
        { 
        "term": { 
         "items.order": "2" 
        } 
        } 
       ] 
       } 
      } 
      } 
     }, 
     { 
      "nested": { 
      "path": "items", 
      "query": { 
       "bool": { 
       "must": [ 
        { 
        "term": { 
         "items.code": "FO" 
        } 
        }, 
        { 
        "term": { 
         "items.order": "3" 
        } 
        } 
       ] 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

お知らせを、しかし指定サブクエリごとにnested、全体ではありません。

nestedキーワードを使用すると、ElasticSearchはメイン文書とは別のネストされた文書内で一致を試みます。もちろん、あなたの例では、項目はすべてのコード注文のカップル"SB"-1,"BB"-2"FO"-3を同時に持つことはできません。しかし、3つのネストされたクエリでそれらを個別に要求することができます。

+0

ありがとう、それは素晴らしいです! – Hammerbot

+0

あなたは大歓迎です! – davide

関連する問題