読者です 読者をやめる 読者になる 読者になる

伸縮自在の愛 (3)

https://media.licdn.com/media/AAEAAQAAAAAAAAOVAAAAJGFkMTFjNWIxLTY1YjMtNDI2My1iYTUzLTFiOTA0MGZmY2JlYQ.png

インデックスをはる準備ができたので、実際にインデックスを構築してみる。


いきなりだけども、こんな感じでクラスメソッドを実装した。



まず、最初のbegin部分でインデックスを削除し、次の部分でマッピングを定義。前回定義したインデックス名前とセッティング、マッピングを使っている。
そして最後のimportで実際にインデックスが構築される。
ちなみにこのメソッドはあくまで全部インデックスを消してやり直すというメソッドなので、更新のたびに呼び出すようなものではない。 マッピングの設定を変えた、とかアナライザーの設定を変えた、とかそういうとき用。

ここまでできたら、RailsコンソールからArticle.reindexを実行してみる。すると、SQL文みたいなログがどば~っと流れるはず。
ちなみに、elasticsearchとkuromojiプラグインのバージョンが合っていないと「kuromojiなんてシラネーヨ」といったエラーが出て、インデックス構築ができないはず。

インデックスを張れたところで早速検索をテスト。Railsコンソールで
Project.find "hogehoge"
と実行してみると、検索対象フィールド全部で"hogehoge"で引っかかるやつを全部見つけてきてくれる。

ただし、全フィールドから検索できればそれでよい、という状況も少ない。user_nicknameに"yamada"を含むものを検索したい、みたいに検索対象フィールドを限ることも多い。そういった場合は、こんな感じになる。

最後に.records.recordsとなっているのは間違えてペーストを二回したわけでもなく、大事なことだから二回書いたわけでもない。
こうすることによって、検索結果がActiverecord::Relationで取得できるので使いやすい。


おかげで最小限の変更でActiverecordを使ってArticle.whereなんちゃらと書いていた部分をelasticsearchを使った実装に置き換えることができる。