伸縮自在の愛 (6)

前回の更新以後、Elasticsearch + Railsで詰まった+解決したポイントをいくつか。

まず、検索は標準で10件しか結果が返ってこない。


いちおうこのようにすると取得件数を増やすことができるんだけれども件数を増やせば増やすほど重くなるので避けたいところ。取得した結果全部をDBに読みに行ってしまう。
解決として、Kaminariでページネーションができる。

  


次に、tagに"wanted_tag"がつけられている記事が欲しいけど、"user_unko"による記事は欲しくない、という場合。これはこういう風にクエリを出す。

)
mustはリスト内の条件すべてを満たしているものを、must_notはリスト内の条件どれか一つでも満たしてはいけないもの。また、加えてshouldという条件があり、これは複数のshouldのどれかを満たしているものを返させる。(なので条件が一つしかないときは無意味。)「どれか一つでも満たしていたら除外」はないっぽい。
このshouldを使うと、複数(≠全部)のフィールドを対象にしたクエリを書くことができる。たとえばtitleとbodyを同時に検索対象にする(userは検索対象にしない)というときは

)
みたいな。
ちなみに、Article.named_scope.__elasticsearch__.search(...)とやるとスコープで絞り込んでから検索することが…残念ながらできない。検索は常にArticle全体が対象になる。

最後、Googleとかによく投げる「elasticsearch つかいかた」みたいな複数キーワードを受ける検索。これはtermではなくquery_stringというのを使うみたい。


上だと"elasticsearch つかいかた"というひとつながりのキーワードで検索されてしまうが
下だと"elasticsearch"と"つかいかた"両方のキーワードで、スコア(類似度?)順に返してくる。
正直ここについてはよくわかってないので、今後調べていきたい。