検索システムを Solr から Elasticsearch に更新しています。すでに多くのことを改善しましたが、製品 (e コマース Web サイト) の人気によってドキュメント (製品) のスコアを高めることはまだ正しくありません。
これが現在のものです(多くの無関係なビットが取り除かれています):
{
"query": {
"function_score": {
"query": {
"multi_match" : {
"query": "renal dog food",
"fields": [ "family_name^20", "parent_categories^2", "description^0.2", "product_suffixes^8", "facet_values^5" ],
"operator": "and",
"type": "best_fields",
"tie_breaker": 0.3
}
},
"functions": [{
"script_score": {
"script": "_score * log1p(1 + doc['popularity_score'].value)"
}
}],
"score_mode": "sum"
}
},
"sort": [
{ "_score": "desc" }
],
}
popularity_score
フィールドには、このアイテムを含む過去 6 週間の合計注文数が含まれています。注文されたことのないアイテムもあれば、30,000 を超えるアイテムもあります (ビジネスを成長させ続けるにつれて、さらに多くのアイテムが増える可能性があります)。かなりの範囲です。
私たちが抱えている問題は、文書 (製品) が、テキストに関しては非常によく一致するかもしれないが、あまり人気がないということです。次に、あまり関連性のない別の製品がクエリにほぼ一致しますが、非常に人気があるため、リストが跳ね上がります。私たちが探しているのは、 を他の一致する結果とpopularity_score
比較して取得し、そのままpopularity_score
取得するのではなく、何らかの形式の正規化を取得できるようにするものです (log1p では不十分な場合があります)。誰か提案やアイデアはありますか?
ありがとうございました!