Help us understand the problem. What is going on with this article?

ElasticsearchのMore Like This Queryを試してみた

More than 3 years have passed since last update.

弊社が運用するcozreマガジンでは、記事の検索にElasticsearchを使っています。理由としては、まあ、色々やりたいことがある(秘密)からなのですがw

先日ようやくユーザ登録機能をリリースしまして、「これでユーザの行動履歴が持てる!ひゃっほーい」ということで、ユーザ登録機能と一緒にリリースした、記事のお気に入り機能のデータを使っての類似記事検索をやってみます!

準備

Elasticsearchを使っていれば、More Like This Queryで簡単に類似検索が出来ます。ということで本日のレシピです。

"mappings" : {
  "post" : {
    "properties" : {
      "id" : { "type" : "long" },
      "title" : { "type" : "string", "index" : "analyzed", "analyzer" : "kuromoji_custom" },
      "content" : { "type" : "string", "index" : "analyzed", "analyzer" : "kuromoji_custom" },
      "tags" : { "type" : "string", "index" : "not_analyzed" }
    }
  }
}
  • 実行するクエリ
curl -XGET localhost:9200/magazine/post/_search?pretty=true -d '
{
  "query": {
    "more_like_this" : {
        "fields" : ["title"],
        "ids" : [50116,65741,66401],
        "percent_terms_to_match" : 0.3,
        "min_term_freq" : 2,
        "max_query_terms" : 25,
        "stop_words" : [],
        "min_doc_freq" : 5,
        "min_word_length" : 0,
        "max_word_length" : 0
    }
  }
}
'

結果

いくつかのパターンで試してみました。

Num fields percent_terms_to_match min_term_freq max_query_terms min_doc_freq min_word_length max_word_length
1 title 0.3 2 25 5 0 0
2 tags 0.3 2 25 5 0 0
3 content 0.3 2 25 5 0 0
4 title,tags 0.3 2 25 5 0 0
5 title,content 0.3 2 25 5 0 0
6 tags,content 0.3 2 25 5 0 0
7 title,tags,content 0.3 2 25 5 0 0

その1

id title score
25868 親子で楽しく体験!社会科見学におすすめなスポット8選|東京&近郊 1.5020734
66721 子どもと一緒に遊んで学ぼう!茨城県の社会科見学スポット3選 1.4598341
6905 国会議事堂、皇居を見学しよう♪ 1.1526392
7903 子どもと一緒にワクワクがいっぱいのフジテレビ見学へおでかけしてみよう! 0.82331365
66732 うなぎパイの工場見学も!静岡県の子どもと楽しむ工場見学4選 0.76972544

その2

ヒット0件

その3

id title score
63721 千葉の工場見学はすごい!親子でうれしい体験がたくさんのスポット4選 0.5898313
43002 人気&定番のおでかけ!親子で学べる自動車の工場見学4選|西日本編 0.56126255
64369 ワクワク体験が待っている!子連れでドキドキ工場見学にゴー|愛知 0.55624
59128 【コメタパン育児絵日記(7)】1歳児が抱えきれるボールの数は・・・ 0.5017484
64126 大人も子どもも思わず夢中になってしまう工場見学のススメ4選|大阪 0.48392826

その4

id title score
25868 親子で楽しく体験!社会科見学におすすめなスポット8選|東京&近郊 1.5020734
66721 子どもと一緒に遊んで学ぼう!茨城県の社会科見学スポット3選 1.4598341
6905 国会議事堂、皇居を見学しよう♪ 1.1526392
7903 子どもと一緒にワクワクがいっぱいのフジテレビ見学へおでかけしてみよう! 0.82331365
66732 うなぎパイの工場見学も!静岡県の子どもと楽しむ工場見学4選 0.76972544

その5

id title score
6905 国会議事堂、皇居を見学しよう♪ 1.1300747
64369 ワクワク体験が待っている!子連れでドキドキ工場見学にゴー|愛知 0.94125086
63721 千葉の工場見学はすごい!親子でうれしい体験がたくさんのスポット4選 0.8591745
33949 冬休みおでかけ必見!山梨の人気工場見学といえば桔梗屋の信玄餅 0.8464964
43002 人気&定番のおでかけ!親子で学べる自動車の工場見学4選|西日本編 0.8333704

その6

id title score
63721 千葉の工場見学はすごい!親子でうれしい体験がたくさんのスポット4選 0.5928047
43002 人気&定番のおでかけ!親子で学べる自動車の工場見学4選|西日本編 0.56401855
64369 ワクワク体験が待っている!子連れでドキドキ工場見学にゴー|愛知 0.55624
59128 【コメタパン育児絵日記(7)】1歳児が抱えきれるボールの数は・・・ 0.5017484
64126 大人も子どもも思わず夢中になってしまう工場見学のススメ4選|大阪 0.48392826

その7

id title score
6905 国会議事堂、皇居を見学しよう♪ 1.1300747
64369 ワクワク体験が待っている!子連れでドキドキ工場見学にゴー|愛知 0.94125086
63721 千葉の工場見学はすごい!親子でうれしい体験がたくさんのスポット4選 0.8591745
33949 冬休みおでかけ必見!山梨の人気工場見学といえば桔梗屋の信玄餅 0.8464964
43002 人気&定番のおでかけ!親子で学べる自動車の工場見学4選|西日本編 0.8333704

感想

  • 「見学」というtermが含まれる記事のスコアが高めに算出されている印象
    • min_term_freqあたりを調整した方がいいかも
    • 特にtitleは同じtermが2回以上使われることが少ない
  • titleでmin_term_freq=1にする場合は、stop_wordsも指定した方がいいかもしれない
    • 例えば「子ども」とか、よくtitleに使われるけど、類似性の判断に使うのは微妙なので
  • fieldsにtagsを指定したものが機能していない
    • これもmin_term_freqを調整しないと。tagsで同じtermが重複することはまずない
  • 類似検索としては正しいけど、「おすすめ記事」としてはそのままは使えなさそう
    • 感覚的に、掃除機を買ったら別の掃除機をおすすめされている感じがする
  • 今回は件数を5件に絞ってしまったけど、実際使うにはスコアで足切りした方がいいかも

ということで、今度はパラメータを調整しての検証をやってみたいと思います。

さいごに

More Like This Queryの結果をそのまま「おすすめ記事」として組み込むというよりは、得られたスコアをベースにして、別の方法で算出したスコアと組み合わせてユーザ毎の「おすすめ記事」を生成しようかなと思っています。
More Like This Query自体のチューニング、別のスコア算出方法の検討、スコアの組み合わせ方のチューニングなど、まだまだサービスに導入するには色々ありそうです。

nabe
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした