18:12WordPressElasticsearchオープンソースの検索エンジンであるElasticsearchを使い、WordPressの検索機能を改善できないか検討したのでメモに残します。WordPressのデフォルトの検索って必要最低限の機能と言った感じで、思い通りに検索結果をカスタマイズしようと思うと結構難しいです。記事に重み付けをして優先度を上げたり、暫く更新されていないページは逆に優先度を落としたりしたいという時は、Elasticsearchだと簡単に出来るので検索部分はこちらへ任せようという考えです。WordPressは高機能化しどんどん進化しているものの、この検索機能部分は時が止まっているように思えたので改善出来ないか頑張ってみます。今回はElasticsearchをCentOSへインストールして、WordPressと連携させるまでを書きます。Elasticsearchの動作デモスポンサーリンクElasticsearchのインストール今回はCentOS7へElasticsearchをインストールしています。Elasticsearchはyumでインストールが可能なのでリポジトリを先に追加します。/etc/yum.repos.d/elasticsearch.repo書き込む内容はこちらです。packagesbaseurl=https://artifacts.elastic.co/packages/7.x/yumgpgcheck=1gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearchenabled=1autorefresh=1type=rpm-mdGPG-KEYをインポートした後はyumを叩いてバージョン7.0.1のElasticsearchをインストールします。使いたいプラグインがあるのですがElasticsearchは全てパッケージのバージョンを揃えないと動作しないので、そのプラグインにバージョンを合わせる形になります。Elasticsearchのクエリテストとかにあると便利なのでKibanaも一緒にインストールしておきます。kibana-7.0.1Elasticsearchの設定Elasticsearchが利用するメモリ量を設定します。最初はデフォルトの1GBで問題無いと思いますが、アクセスが多い場合はここを調整すると良いと思います。space-Xms1g-Xmx1g次はElasticsearchのデータをダンプ、リストアする為に必要な設定を追加しておきます。ここに指定したディレクトリにデータを配置してダンプやリストアを行いますが、設定反映には再起動が必要なので最初にやっておきます。["/home/elasticsearch"]その他、設定したい項目がある場合は適時やっておきます。プラグインのインストール日本語データを扱うのでそれに必要なプラグインをインストールします。新語に対応するためにelasticsearch-analysis-kuromoji-ipadic-neologdというサードパーティ製のプラグインを導入しますが、公式は頻繁に更新するのでElasticsearchのバージョンはここに合わせています。analysis-icu最新ではないElasticsearchを使っているため一部警告が表示されますが無視します。インストールされたプラグインを確認するにはこのようにします。listanalysis-icuanalysis-kuromojianalysis-kuromoji-ipadic-neologdプラグインをアンイストールする場合はこのようにします。analysis-kuromojiElasticsearchの起動ここまで終えたら自動起動の設定をし、ElasticsearchとKibanaを起動させます。kibana9200番ポートにcurlで接続してこのようなヘルスチェックが返ってくればOKです。Search"}Kibanaは5601番ポートで起動していると思うので、ポートを開けるかプロキシしてアクセスします。Elasticsearchのマッピングを設計する次はElasticsearchにインデックスを作ります。マッピングの設定はDBでいうところのテーブル設計のような感じです。マッピング情報はJSON形式で記述し、wordpress.jsonというファイル名で保存しておきます。今回はWordPressのデータをインデックスに投入していきますのでこのようなマッピングにしました。"date_time_no_millis"}}}}肝心なのはtokenizer、analyzer、mappingsの箇所で、tokenizeとanalyzerはデータの扱い方法を。mappingsはデータベースでいうところのカラムみたいな物で、カラム毎にデータをどう扱うかを設定します。設定されているので、ここへの検索キーワードはneologd対応のkuromojiで分かち書きして検索され、もしngram_analyzerを使った場合は単語を指定文字数で切って検索します。日本語の文章であれば分かち書きを使うkuromojiで検索した方が良い結果になりやすく、ひらながやカタカナだけならngramの方が良かったりします。WordPressだと検索キーワードが完全一致する部分が無いと拾ってこないですが、このマッピングの設定ではキーワードの一部分だけでもヒットするようになります。tokenizeとanalyzerはもっとチューニングする必要がありそうですがまずはこんな感じマッピングします。Elasticsearchにインデックス作るマッピングの設計が完了したらインデックスを作ります。インデックスのエイリアスを作成という順でやっていきます。プレフィックスが付いたインデックス名を作成する時に、自動でこのテンプレートが使われるようになります。"wordpress-20191129"}プレフィックスに日付を付けた形式でインデックスを作成しておきます。いう名前でエイリアスを張っておきます。する事でアプリケーションからはwordpressというインデックス名でアクセスできるようになり、インデックスを変更した場合でもエイリアスの張替えだけで簡単にできるようになります。Elasticsearchのインデックスにデータを投入するWordPress用のインデックスが出来たのでここへデータを投入します。WordPressからコンテンツデータを引っこ抜いてAPIでElasticsearchに流し込んでいくだけなのでここは割愛。ElasticsearchとWordPressを連携するようやくメインの部分。両者を連携させWordPressの検索をElasticsearchに処理させます。検索するとそれっぽいWordPressプラグインもあるのですが、メンテが止まっていて動かなかったり有効化した後にエラーが起きて大変な目に合ったので自作しました。APIを叩くだけなのでそう難しい処理では無いです。);ホスト名だけ環境に合わせれば、これを利用テーマのfunctions.phpに丸コピーで動きます。Elasticsearchで検索できなかった場合はWordPressのデフォルトの検索を使うようにプログラムしていますので、Elasticsearchに障害が起きても大丈夫なはず。テストなので簡単な検索クエリしか書いていませんが、あとは普通にWordPressの検索フォームから検索をしてみて結果が返ってくれば成功です。言っても、どちらで検索しているか見た目上はわからないので適当にデバックしながらやるといいと思います。これだけのコードでWordPressとElasticsearchを連携させる事がきました。Elasticsearchの動作デモ折角連携させたのでElasticsearchとWordPressの検索結果を比較してみたいと思います。「kernelトラブル」というキーワードでこのブログを検索してみます。WordPressのデフォルトの検索から。「kernelトラブル」をWordPressのデフォルト検索この記事がヒットしますが、それ以外に「kernelトラブル」というキーワードに一致する文章は書いていないので何もヒットしないと思います。次はElasticsearchです。検索クエリは少しチューニングしてタイトルと本文から検索します。数件ヒットしたかと思います。このインデックスのアナライザでキーワードを解析してみると、「kernel」と「トラブル」に分かち書きされて検索されたようです。指定しているので、分かち書きされたどちらかのキーワードが登場する投稿がヒットします。微妙なコンテンツまでヒットしているようですが今回はテストなのでこんな所で。Elasticsearchは検索結果をスコア計算して返してくれるので、タイトルに重み付けしてみたりコンテンツ部分は完全一致にしてみたりと色々出来そうです。今回はElasticsearchの導入とWordPressへの組み込みが目的だったので、検索クエリのチューニングは次回に回します。