私は ES にかなり慣れていないので、ほとんどの大規模な e コマース ストアと同じ方法でファセット ナビゲーションを実装しようとしています。
私の製品マッピングの一部は次のようになります。
'name' => [
'type' => 'string',
'analyzer' => 'english_analyzer',
],
'range' => [
'type' => 'string',
'analyzer' => 'english_analyzer',
],
'filters' => [
'type' => 'nested',
'properties' => [
'name' => [
'type' => 'string',
'index' => 'not_analyzed',
],
'values' => [
'type' => 'object',
'properties' => [
'name' => [
'type' => 'string',
'index' => 'not_analyzed',
]
]
]
]
],
ご覧のとおり、ファセットをネストされたオブジェクトとして「フィルター」に格納しています。
私の検索クエリでは、この集計をクエリに追加できます。
'aggs' => [
'facets' => [
'nested' => ['path' => 'filters'],
'aggs' => [
'filters' => [
'terms' => [
'field' => 'filters.name', //facet group name
'size' => 0
],
'aggs' => [
'id' => [
'terms' => [
'field' => 'filters.id' //facet group ID
]
],
'values' => [
'terms' => [
'field' => 'filters.values.name', //facet name
'size' => 0
],
'aggs' => [
'id' => [
'terms' => [
'field' => 'filters.values.id' //facet id
]
]
]
]
]
]
]
]
]
これにより、ナビゲーションに貼り付けるファセットの優れたリストが得られます。選択したファセットをドキュメントの結果に適用するには、次の 2 つの方法があります。「ポスト フィルター」または「フィルターされたクエリ」を使用します。
ポスト フィルターは、クエリの後に集計を適用するため、ユーザーが選択したファセットに関係なく、ドキュメント カウントが得られます。対照的に、フィルター処理されたクエリは、選択されたファセットに基づいてファセット数を計算しますが、一致するドキュメントがないファセットを非表示にします。
私がしなければならないこと、そしてほとんどの大手 e コマース ストアが行っていることは、2 のハイブリッドです。
これらのファセットがある場合:
色:
- 赤 (1)
- ブルー (2)
- グリーン (3)
ブランド:
- アウディ (1)
- フォード (2)
- BMW (3)
誰かが青を選択した場合、カウントは赤と緑で同じままである必要がありますが、ブランドのカウントに影響します.
Stack Overflow で同様の質問を見つけました: ElasticSearch 集計: 集計ごとに 1 つのフィルターを除外します
収集できるものから、事前に定義されたファセットのリスト (リレーショナル DB から) を提供し、それらを集計に追加する必要があります。そこで、ファセット グループの手動リストを作成し、これらのそれぞれにフィルター バケット ( https://www.elastic.co/guide/en/elasticsearch/guide/current/_filter_bucket.html ) を追加します。フィルター内で、ユーザーが選択したすべてのファセットを含む bool クエリを追加する必要があります。これには、各ファセット グループに含めるファセットが含まれ、そのグループに属するファセットは除外されます。
これで、ファセット グループごとにグループ化/バケット化された集計の膨大なリストができました。これらのそれぞれには、多数の選択されたフィールドを持つ可能性のある bool クエリを含むフィルターがあります。クエリが非常に大きいため、ここに投稿した場合、1 ページに収まらない可能性があります。
これは、私が以前にやらなければならなかったことがほとんど必要だったことを考えると、私のクエリへのクレイジーな追加のように思えます。これは私がこれを達成できる唯一の方法ですか?
私の質問が十分に明確であることを願っています。