Apache Solr で特定の検索結果の順位を上げたり下げたりする
Apache SolrのDismaxを使った、bqとその逆をやるnegative boostについて
bq(boost query)
edismaxのクエリにbqを追加するとbqにマッチしたものへのスコアが加算される。 ワンピースで検索した際の検索結果がこんな感じだとする。
クエリ
タイトルにマッチするとスコアが10になるedismaxの重み付で検索
q=ワンピース&qf=title^10
検索結果
"docs": [
{
"title": "ワンピース1",
"body": "boost用の本文",
"category": "本",
"score": 10
},
{
"title": "ワンピース2",
"body": "テスト用の本文",
"category": "本",
"score": 10
},
{
"title": "ワンピース3",
"body": "boost",
"category": "電子書籍",
"score": 10
},
bqクエリを追加する
bqを追加する
q=ワンピース&qf=title^10&bq=category:"電子書籍"^5
検索結果
category電子書籍のもののscoreが15になる。
"docs": [
{
"title": "ワンピース3",
"body": "boost",
"category": "電子書籍",
"score": 15
},
{
"title": "ワンピース1",
"body": "boost用の本文",
"category": "本",
"score": 10
},
{
"title": "ワンピース2",
"body": "テスト用の本文",
"category": "本",
"score": 10
},
negative boost
bqの値を少し調整するとboostの逆っぽい挙動が可能になる。 具体的には、以下の検索結果がある時、
クエリ
q=ワンピース&qf=title^10
検索結果
"docs": [
{
"title": "ワンピース",
"body": "テスト用の本文",
"category": "ファッション",
"score": 10
},
{
"title": "ワンピース ピンク",
"body": "boost用の本文",
"category": "ファッション",
"score": 10
},
{
"title": "ワンピース3",
"body": "boost",
"category": "電子書籍",
"score": 10
},
negativeboost用のクエリ
q=ワンピース&qf=title^10&bq=(*:* -category:ファッション)^5
のように書くと、ファッションカテゴリ以外の結果にスコアが5加算されるようなる。
検索結果
"docs": [
{
"title": "ワンピース3",
"body": "boost",
"category": "電子書籍",
"score": 15
},
{
"title": "ワンピース",
"body": "テスト用の本文",
"category": "ファッション",
"score": 10
},
{
"title": "ワンピース ピンク",
"body": "boost用の本文",
"category": "ファッション",
"score": 10
},
特定の検索結果だけを上げたいのはboostでいけるのは知っていたけど、その逆をできるのは初めて知った。若干トリッキーだけども。パフォーマンスに影響しそうなので、インデックスのサイズと負荷には注意が必要。
この商品だけ検索結果から上げたい、下げたいってのは結構ありがちなので、覚えておきたい。