2017-06-05 8 views
0

インデックスに複数のタイプ(product、sku、mediaなど)のインデックスがあるとします(インデックスは製品インデックス)。ElasticSearchドキュメントを同じインデックスで複数のタイプから集計する方法はありますか?

例のドキュメント:製品インデックス、製品タイプ、製品インデックスに

{ 
    "_type": "product", 
    "id": 1, 
    "name" : "product 1" 
} 

{ 
    "_type": "product", 
    "id": 2, 
    "name" : "product 2" 
} 

、SKU型製品インデックスに

{ 
    "_type": "sku", 
    "id": 1, 
    "name" : "sku 1", 
    "product_id": 1 
} 
{ 
    "_type": "sku", 
    "id": 2, 
    "name" : "sku 2", 
    "product_id": 1 
} 

{ 
    "_type": "sku", 
    "id": 3, 
    "name" : "sku 3", 
    "product_id": 2 
} 

、培地中

タイプ

私はElasticSearchにクエリして、SKU、メディアと共にすべての製品を取得したいと考えています。

予想される応答:

[ 
{ 
    "_type": "product", 
    "id": 1, 
    "name" : "product 1", 
    "skus" : [ 
     { 
     "_type": "sku", 
     "id": 1, 
     "name" : "sku 1", 
     "product_id": 1 
     }, 
     { 
     "_type": "sku", 
     "id": 2, 
     "name" : "sku 2", 
     "product_id": 1 
     } 
    ], 
    media: [ 
    { 
     "_type": "media", 
     "id": 1, 
     "name" : "media 1", 
     "product_id": 1 
    } 
    ] 
}, 
{ 
    "_type": "product", 
    "id": 2, 
    "name" : "product 2", 
    "skus": [ 
     { 
      "_type": "sku", 
      "id": 3, 
      "name" : "sku 3", 
      "product_id": 2 
     } 
    ]  
} 
] 

私はすべての彼らのドキュメントhttps://www.elastic.co/guide/en/elasticsearch/reference/current/search.html上で通過していますが、どのアプローチを見つけることができませんでした。

どのようにすればいいですか?

私はelasticsearchと話すためにJavaクライアントを使用しています。

答えて

0

親子関係を作成するマッピング機能のメタフィールドは_parentです。あなたのための例を実装しました:

DELETE 44368941 

PUT 44368941 
{ 
    "mappings": { 
    "product": { 
     "properties": { 
     "id": { "type": "integer" }, 
     "name": { "type": "keyword"} 
     } 
    }, 
    "sku": { 
     "properties": { 
     "id": { "type": "integer" }, 
     "name": { "type": "keyword"} 
     }, 
     "_parent": { "type": "product" } 
    }, 
    "media": { 
     "properties": { 
     "id": { "type": "integer" }, 
     "name": { "type": "keyword"} 
     }, 
     "_parent": { "type": "product" } 
    } 
    } 
} 

POST 44368941/product/1 
{ 
    "id": 1, 
    "name" : "product 1" 
} 

POST 44368941/product/2 
{ 
    "id": 2, 
    "name" : "product 2" 
} 


POST 44368941/sku/1?parent=1 
{ 
    "id": 1, 
    "name" : "sku 1" 
} 

POST 44368941/sku/2?parent=1 
{ 
    "id": 2, 
    "name" : "sku 2" 
} 

POST 44368941/sku/3?parent=2 
{ 
    "id": 3, 
    "name" : "sku 3" 
} 

POST 44368941/media/1?parent=1 
{ 
    "id": 1, 
    "name" : "media 1" 
} 

POST 44368941/media/2?parent=1 
{ 
    "id": 2, 
    "name" : "media 2" 
} 


POST 44368941/product/_search 
{ 
    "query" : { 
     "bool": { 
      "should": [ 
      { 
       "has_child" : { 
        "type" : "sku", 
        "query" : { 
         "match_all": {} 
        }, 
        "inner_hits" : {} 
       } 
      }, 
      { 
       "has_child" : { 
        "type" : "media", 
        "query" : { 
         "match_all": {} 
        }, 
        "inner_hits" : {} 
       } 
      } 
      ] 
     } 
    } 
} 

結果は以下のとおりです。これはあなたの要求と同じではありませんが、非常に似ています。詳細については

{ 
    "took": 10, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 2, 
    "max_score": 2, 
    "hits": [ 
     { 
     "_index": "44368941", 
     "_type": "product", 
     "_id": "1", 
     "_score": 2, 
     "_source": { 
      "id": 1, 
      "name": "product 1" 
     }, 
     "inner_hits": { 
      "media": { 
      "hits": { 
       "total": 2, 
       "max_score": 1, 
       "hits": [ 
       { 
        "_type": "media", 
        "_id": "1", 
        "_score": 1, 
        "_routing": "1", 
        "_parent": "1", 
        "_source": { 
        "id": 1, 
        "name": "media 1" 
        } 
       }, 
       { 
        "_type": "media", 
        "_id": "2", 
        "_score": 1, 
        "_routing": "1", 
        "_parent": "1", 
        "_source": { 
        "id": 2, 
        "name": "media 2" 
        } 
       } 
       ] 
      } 
      }, 
      "sku": { 
      "hits": { 
       "total": 2, 
       "max_score": 1, 
       "hits": [ 
       { 
        "_type": "sku", 
        "_id": "1", 
        "_score": 1, 
        "_routing": "1", 
        "_parent": "1", 
        "_source": { 
        "id": 1, 
        "name": "sku 1" 
        } 
       }, 
       { 
        "_type": "sku", 
        "_id": "2", 
        "_score": 1, 
        "_routing": "1", 
        "_parent": "1", 
        "_source": { 
        "id": 2, 
        "name": "sku 2" 
        } 
       } 
       ] 
      } 
      } 
     } 
     }, 
     { 
     "_index": "44368941", 
     "_type": "product", 
     "_id": "2", 
     "_score": 1, 
     "_source": { 
      "id": 2, 
      "name": "product 2" 
     }, 
     "inner_hits": { 
      "media": { 
      "hits": { 
       "total": 0, 
       "max_score": null, 
       "hits": [] 
      } 
      }, 
      "sku": { 
      "hits": { 
       "total": 1, 
       "max_score": 1, 
       "hits": [ 
       { 
        "_type": "sku", 
        "_id": "3", 
        "_score": 1, 
        "_routing": "2", 
        "_parent": "2", 
        "_source": { 
        "id": 3, 
        "name": "sku 3" 
        } 
       } 
       ] 
      } 
      } 
     } 
     } 
    ] 
    } 
} 

次のリンクを確認してください:

関連する問題