More_this_thisクエリ関する質問


(Takahiro Horike) #1

実現したいこと

more_this_thisクエリを使ってブログメディアの関連記事を抽出するシステムを作っております。その中で以下の仕様を実現したいと考えています。

  1. 特定の単語が本文に存在している記事はmore_this_thisの結果に出さない
  2. 特定の単語が本文に存在している記事のmore_this_thisの結果のスコアをあげたい

現在試している方法

1に関してはstop_wordsのオプションを。2に関してはboost_termsのオプションを使用することで実現出来ると考え以下の様なクエリを作りました。

"more_like_this" : {
  "fields" : ["post_title","post_content"],
  "like_text" : "{記事本文}",
  "stop_words":["禁止ワード1","禁止ワード2","禁止ワード3"]
  "min_term_freq" : 1,
  "max_query_terms" : 50,
  "boost": 30.0
}

##質問内容
結果としてstop_wordsで指定した語句が含まれた記事は排除されず。boost_termsに至っては特定の単語を設定するような仕様になっていないようで使い方そのものが不明な状態です。公式のドキュメントも目を通しましたが、ちょっと解決の目処が立たない状況です。

もしかするとstop_wordsとboost_termsオプションに対する私の解釈から間違っているのではないかと考えております。この辺り助言をいただけますと幸いです。

Elasticsearchのバージョン

2.3


(Jun Ohtani) #2

1.に関してはmore like thisの中でその単語を使わないだけであって、その単語を持ったドキュメントをフィルタリングする目的ではありません。
ですので、特定の単語を持ったドキュメントを検索結果に含めたくない場合はboolクエリmust_notなどで、含めたくない単語にヒットするクエリを検索条件として追加し、mustmore_like_thisを利用するような形がいいかと。

2.に関しては、function_score_queryなどで、特定の単語にヒットするクエリの場合にスコアを上げるといった操作をすれば良いかと思います。
more_like_thisboost_termsmore_like_thisに使われた単語すべてにブーストをかけるための機能ですので。


(Takahiro Horike) #3

ありがとうございました。上記で解決いたしました。


(system) #4