前回までで一旦Go言語でOpenSearchに検索を行い、結果を取得するところまで作成しました。
今回は検索条件として「キーワード」を設定できるように改修してみます。
検索クエリをどうやって組み立てる?
GoからOpenSearchに検索を行う時に頭を悩ませそうなのが「検索クエリをどうやって組み立てるか?」ということ。
個人的にOpenSearchのQueryDSLは構造が結構複雑かなと感じていて、複雑な条件が組み合わさった時に上手く条件を組み立てる方法がいまいち見つかっていません。
今回はキーワードのみ対応させるということで、「組み立てられたQueryDSLの文字列置換を行う」という方法で対応してみたいと思います。
具体的なGo言語のコードは以下の通り。
queryStr := `{
"size": 5,
"query": {
"match": {
"work_title" : "%s"
}
}
}`
content := strings.NewReader(fmt.Sprintf(queryStr, searchRequest.Keyword))
クエリ内に%sを仕込んでおき、Goのfmt.Sprintf関数で%sの部分にパラメータで渡ってきたキーワードを埋め込むというシンプルな方法です。
一旦これで上手くキーワード検索が実施できるか試してみましょう。
魔術で検索を行うと、作品タイトルに魔術を含むタイトルが複数ヒットしました。動作は問題なさそうです。
次は「ストライク」のキーワードで検索を行ってみました。
自分の好きな「ストライクウィッチーズ」シリーズがヒットしません。なぜでしょうか・・・?
Analyzeを利用してキーワードの解析情報を確認する
「ストライク」で検索した場合に「ストライクウィッチーズ」では検索できないのに、「ストライク・ザ・ブラッド」では正常に検索できました。
(今回の仕様はストライクで検索しても、ストライクウィッチーズが検索されてほしい)
ストライク・ザ・ブラッドではちょどよくタイトルが分割されているのに対して
ストライクウィッチーズでは分割されず、「ストライクウィッチーズ」のままインデックスに登録されたことが原因のようです。
kuromojiという日本語向けの形態素解析を利用していますが、あまり一般的ではない言葉を多く含むアニメのタイトルなどでは、その力をあまり発揮できないのかもしれません。
次に向けて
現状ではインデックスが上手く作成されず、検索にヒットすべきデータがヒットできていない状態なので、こちらの改善を目標に作業を進めて行こうと思います。