はじめに
BitStar Advent Calender21日目を担当するBitStarの@tak_11です!
BitStarのプロダクトでは一部OpenSearchを使用しています。
OpenSearchは検索以外に分析など幅広い機能がありますが、まだまだ活用しきれているわけではなく、どのように機能をプロダクトに盛り込むか日々模索中です。(個人的に)
そこで今回はsignificant_textというクエリを使って検索機能改善について考えてみました!
significant_textとは
特定のデータセットにおいての特徴語を抽出するクエリです。これは単純に出現回数の多い単語を抽出するのではなく、ある単語の出現率が特定のデータセット内とindex全体で大きく変化したときにそれを特徴語として抽出します。
何に使うか
BitStarにはBitStar Databaseというプロダクトがあり、その機能の一つとしてYouTuberが投稿した動画を検索できる機能があります。
今回は自社の商品をPRしたいと考えている架空のユーザーがいるとして、BitStar DatabaseでPR動画の前例を探し、そこからイメージに沿った動画を投稿しているインフルエンサーを見つけたいとします。
商品のイメージは以下です。
- プチプラ
- ファッション系
sigificant_textのユースケースとして、今回はそのインフルエンサー探しをサポートしてみます。
どうサポートするか
まずユーザーが検索窓で「プチプラ」と検索します。
BitStarでは動画のタイトルやハッシュタグなどをdocumentに保存しているので、検索キーワードが引っかかればその動画を返します。
んー、サムネイルだけを見た感じプチプラではあるもののコスメ系がヒットしてしちゃってますね🤔
ここである程度検索に慣れているユーザーなら検索クエリを改善して次の検索を実行するでしょう。
ただ、もしそこまで検索に慣れていないユーザーであれば、「プチプラ」というキーワードだけでざっくり並べられた検索結果を眺めた後、あまりピンとこずに離脱してしまうかもしれません。
ではここでsignificant_textを使って次の検索クエリをナビゲートしてみます。
ユーザーの検索クエリ「プチプラ」を利用し、そのクエリに該当するdocumentから特徴語を抽出します。
リクエスト
GET youtube_index/_search
{
"size": 0,
"query": {
"bool": {
"filter": [
{
"match_phrase": {
"title": "プチプラ"
}
},
{
"range": {
"published_at": {
"gte": "now-1y/d"
}
}
}
]
}
},
"aggs": {
"sample": {
"sampler": {
"shard_size": 100
},
"aggs": {
"suggests": {
"significant_text": {
"field": "title"
}
}
}
}
}
}
レスポンス
"aggregations": {
"sample": {
"doc_count": 78,
"suggests": {
"doc_count": 78,
"bg_count": 55935623,
"buckets": [
{
"key": "プチプラ",
"doc_count": 78,
"score": 4191.132428988983,
"bg_count": 13343
},
{
"key": "dazy",
"doc_count": 3,
"score": 599.5630198953779,
"bg_count": 138
},
{
"key": "ドラコス",
"doc_count": 3,
"score": 344.7323902859961,
"bg_count": 240
},
{
"key": "shein",
"doc_count": 13,
"score": 99.17271735964593,
"bg_count": 15641
},
{
"key": "lookbook",
"doc_count": 10,
"score": 94.22616045046415,
"bg_count": 9744
},
{
"key": "デートコーデ",
"doc_count": 3,
"score": 92.20792022059068,
"bg_count": 897
},
{
"key": "夏服",
"doc_count": 6,
"score": 72.69792691240836,
"bg_count": 4548
},
{
"key": "qoo",
"doc_count": 5,
"score": 59.60548065231446,
"bg_count": 3852
},
{
"key": "カワ",
"doc_count": 3,
"score": 47.98533674236832,
"bg_count": 1723
},
{
"key": "コーデ",
"doc_count": 18,
"score": 47.499849105741745,
"bg_count": 62409
}
]
}
}
}
見やすいようにリストにしたものがこちらです。
- プチプラ
- dazy
- ドラコス
- shein
- lookbook
- デートコーデ
- 夏服
- qoo
- カワ
- コーデ
この中から今回はYouTubeっぽい「lookbook」を元の検索クエリに追加してみましょう。
最初よりはユーザーが求めていそうな検索結果になったのではないでしょうか?
検索があまり得意でないユーザーも上記の抽出キーワードを活用すれば、ユーザーの情報要求を満たす検索クエリをこちらからサジェストできます。
また、繰り返し検索を促すことで意図した検索結果を表示するための検索クエリをユーザー自身が構築することにも繋がりそうです。
インフルエンサー検索は難しい?
YouTuber等インフルエンサーという存在が出てきてそれなりになりますが、業界・トレンドの変化が激しい分野のため、常に十分な知識を持ち続けることは困難です。
なのでインフルエンサー検索においてはユーザーが検索を重ねる中で新しい知識を蓄え、自身の求める情報を言語化できるようになる必要がある。
そのためには2回、3回と連続して検索してもらうためのサポートが重要になるのではないかと感じました。
振り返り
実際に本番で使うには形態素解析の精度が少し弱かったり、「夏服」に関しては時期によってクエリサジェストに使えなかったりと課題は多いなという印象です。
analyzerを調整したり、クエリ自体の改善も必要になりそうです。
とはいえElasticsearch,OpenSearchを勉強し始めてまだ少しなので地道に取り組んでいこうと思います💪
最後に
BitStarでは最初に触れたReact, TypeScriptやRuby, Railsを活用した開発を行っており、一緒に開発できるエンジニアを積極募集中です!
ご興味のある方はぜひ以下の募集情報をご確認ください!