2017-09-27 18 views
1

私はElasticSearchインデックスを持っています。オンラインストアのような製品が格納されています。今では私の店で製品のバリエーションを紹介したいと思いますが、すでにこのインデックスを使用しているツールがたくさんあるので、ネストされたデータ型や親子データ型を使用するようにインデックスを変更することはできません(これらのツールまた、)。余分なフィールドを追加することしかできませんでした。 - >インデックス時に論理グループにインデックスおよびグループバリアントを再構築できません。ElasticSearch:論理グループの最初の結果のみを返す

クエリ時にこのようなアイテムのグループを取得する最適な方法は何ですか? もう1つの問題:多くの商品が非バリアントなので、クエリの結果は、バリアント(グループ化)と非バリアントの別々のアイテムからミックスを返さなければなりません。それらは_scoreによってすべてソートされなければなりません。 可能なオプション:バリアントグループのすべてのアイテムを取得せず、各バリアントグループからの最良の結果のみを取得しても問題ありません。しかし、別の検索結果としてバリアントグループのアイテムを取得しないようにする必要があります。

多分私達は複数のクエリでそれを達成することができます - variant_idを超える最初のいくつかの集約と同様、後に別のクエリを

例すべての項目を取得する: 次の行のインデックスが作成されています

{"title": "Samsung TV xxx"} 
{"title": "Philips TV yyy"} 
{"title": "Nike shoe MyRun", "size": 40, "variant_group": 5} 
{"title": "Nike shoe MyRun", "size": 42, "variant_group": 5} 
{"title": "Adidas shoe YourRun", "size": 39, "variant_group": 10} 
{"title": "Adidas shoe YourRun", "size": 40, "variant_group": 10} 
{"title": "Adidas shoe YourRun", "size": 46, "variant_group": 10} 
{"title": "Dictionary book"} 

マイクエリ

{"title": "Samsung TV xxx"} 
{"title": "Philips TV yyy"} 
[ 
    {"title": "Nike shoe MyRun", "size": 40, "variant_group": 5} 
    {"title": "Nike shoe MyRun", "size": 42, "variant_group": 5} 
] 
[ 
    {"title": "Adidas shoe YourRun", "size": 39, "variant_group": 10} 
    {"title": "Adidas shoe YourRun", "size": 40, "variant_group": 10} 
    {"title": "Adidas shoe YourRun", "size": 46, "variant_group": 10} 
    {"title": "Dictionary book"} 
] 
{"title": "Dictionary book"} 

OR(各バリアントグループからの最良の結果)これらのすべてのアイテムに一致するものは、 :

{"title": "Samsung TV xxx"} 
{"title": "Philips TV yyy"} 
{"title": "Nike shoe MyRun", "size": 40, "variant_group": 5} 
{"title": "Adidas shoe YourRun", "size": 39, "variant_group": 10} 
{"title": "Dictionary book"} 

答えて

0

あなたは用語の集約に組み合わせtop hits sub-aggregationを使用することができます。

curl -XGET 'localhost:9200/your_index/products/_search&pretty' -H 'Content-Type: application/json' -d' 
{ 
    @@@ your filters here @@@ 
    "size": 0, 
    "aggs": { 
     "variant_groups": { 
      "terms": { 
       "field": "variant_group", 
       "size": 20, 
       "missing": "No group", 
      }, 
      "aggs": { 
       "products_hits": { 
        "top_hits": { 
         "size" : 1 
        } 
       } 
      } 
     } 
    } 
} 
' 

これは、各variant_groupのためのあなたのフィルターに応じて、トップの製品を返します。

現在、頻度に基づく上位20のグループのみですが、順序とサイズは、用語集のパラメータordersizeを使用して変更できます。必要に応じて、サイズに大きな値を使用できます。

missingパラメータは、値のないドキュメントの処理方法を定義します。デフォルトでは無視されますが、値を持っているかのように扱うこともできます。

結果はhitsの代わりにのElasticsearchレスポンスの一部になり、クエリのルートにsize: 0を使用して空のままになります。

+0

ありがとうございます!しかし、私はvariant_groupを持つ製品を手に入れます。 variant_groupを持たない他の製品とは何ですか? {"title": "Samsung TV xxx"} – vadimiron

+0

ように編集されました( 'missing'パラメータ) – Pandawan

関連する問題