ElasticSearchで親子関係のあるindexがあり、子indexでスコアリングを行い、よりスコアの高い親indexのドキュメントを取得しようとしています。
実際には異なりますが、例として以下のようなケースを想定します。
インデックス構成
親index…Cloth 洋服のレコードを格納
子index…Variation 洋服のサイズ・色の組み合わせを格納
検索要件
Variationで色ごとに重みをつけて、スコアの高いClothを抽出する。
例えばyellowなら5倍、blueなら3倍といったようにします。
また重複と認め、yellowが2つあるなら2回カウントし、scoreが10になるようにします。
ハマってること
現在以下の様なクエリを組んでおり、has_child単体でのスコアをweightで乗算したいのですが、has_child単体とのスコアが変わってしまってしまう。
(実在しないケースですので多少の文法ミスが有るかもしれません)
json
1"function_score": { 2 "query": {"match_all": {}} 3 "functions": [ 4 { 5 "filter": { 6 "query": { 7 "has_child": { 8 "type": "variations", 9 "score_mode": "sum", 10 "min_children": 1, 11 "query": { 12 "term": { 13 "color": "yellow" 14 } 15 } 16 } 17 } 18 }, 19 "script_score": { 20 "script": "_score" 21 }, 22 "weight": 5 23 } 24 ] 25}
例えば上のクエリの場合、function_scoreを通さずに、単体でhas_childのクエリを実行すると重複した分だけスコアが返ってきます。
例えばyellowが2つあればscoreが2となります。
しかしfunction_scoreを通すと重複を許さず、has_childに該当すれば一律で1が返ってきてしまうので、思うようなスコアリングができません。
このようなケースで正しくスコアリングするにはどうすればよいでしょうか。
よろしくお願いします。
あなたの回答
tips
プレビュー