Windowsで全文検索 Apache Solr をWindows10で構築
全文検索といえば、昔はNamazuでした。Excel/Wordの検索ができましたが、残念ながら、図形オブジェクトは検索できないなど、微妙に使いにくいところがありましたが、それでも重宝しました。プロジェクトのドキュメント検索などには大きな威力を発揮していました。
しかし調べてみると、もう今は開発が止まって久しく、使っている人はほとんどいないのでしょうか。というわけで、今よく使われている無償の全文検索システム、Solrを試してみることにしました。Linuxでの構築記事はいくつかありましたが、Windows環境でやったものはほとんどなく、情報集めに苦労しましたので、いい備忘録になるでしょう。資材さえそろえれば、オフラインで構築可能な手順になっています。
Apache Solrは10年以上昔からあるものです。RESTのIFを持ち、文書の登録・インデックス追加削除や、検索まですべてRESTで行えるのが特徴です。また、プレーンテキスト以外、Excel/Wordのオブジェクトもインデックス化でき、PDFにも対応。これだけできれば、普通に業務文書の検索には十分でしょう。どうも画像などのバイナリもできるらしいのですが、それはおいおい試していくとして、今回は導入・初期設定までとします。いつものように、赤字がコマンドです。
環境
OS:Windows10 64bit
Web:Apache httpd-2.4.41 + PHP 7.1 + PHP-Solr
Solr:Solr 8.4.1
1.資材の取得
・Java1.8
Solrを動かすのに必要となります。環境に合ったJREをOracleサイトから入手し入れましょう。これはメジャーなので詳細は省きます。
・VisualStudio2015のVisualC++再頒布可能パッケージ
これがないとApache, PHPなどが動きません。Windows10ならおそらく最初から入っていると思いますので、コントロールパネルで探してみてください。なければ以下から取得します。32bit/64bitを間違えないように。
https://www.microsoft.com/en-us/download/detail.aspx?id=48145
・Apache httpd
2.4.41をダウンロードします。32bit/64bitを間違えないように。
https://www.apachelounge.com/download/
・PHP
7.1を使います。アーカイブからダウンロード。Apacheと連携する場合は必ずスレッドセーフ版。ファイル名にntfとあるのはNon-Thread-Safeなので違います。紛らわしいですね。あと、32bit/64bitを間違えないように。
https://windows.php.net/downloads/releases/archives/
・PHP-Solr
SolrをPHPで楽に使えるようにするための拡張です。RESTのAPIをとても簡易に利用できます。今回はPHP7.1用の2.4.0を使います。これもスレッドセーフ版を選びます。「TS」はThread-Safe。「NTS(Non-Thread-Safe)」を選ばないように。あとこれも32bit/64bitを間違えないように。
https://pecl.php.net/package/solr/2.4.0/windows
2.PHPインストール
・ZIPを解凍
ダウンロードしたphp-7.1.9-Win32-VC14-x64.zipを解凍します。
php-7.1.9-Win32-VC14-x64とか長いフォルダができます。長すぎるので、フォルダ名をphpに変更し、Cドライブ直下に移動します。
C:\phpの下にext、extrasなどがある構成です。
ダウンロードしたphp_solr-2.4.0-7.1-ts-vc14-x64.zipを解凍します。
中にphp_solr.dllが入っていますので、C:\php\extの下にコピーします。
C:\php\php.ini-production を、同じディレクトリにphp.iniとしてコピーし、php.iniを編集します。
以下の1行を追加します。
extension=php_solr.dll
また、以下の行のコメントを外します。
extension=php_curl.dll
編集したら、保存しましょう。php_solrはPHPのsolr拡張機能、php_curlはcurl拡張機能です。
・環境変数追加
PHPのコマンドを使えるように、環境変数Pathに追加します。
スタートボタン右クリック>システム>システム情報>システムの詳細設定>環境変数
ユーザ環境変数Pathに、PHPのフォルダを追加します。
C:\php
設定したら、コマンドプロンプトから以下のコマンドを打ってみてください。
php -version
PHP 7.1.9 (cli) (built: Aug 30 2017 18:34:46) ( ZTS MSVC14 (Visual C++ 2015) x64 )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
こんなメッセージが出れば、PHPのインストールには成功しています。
2.Apache httpd インストール
・ZIPを解凍
まず、ダウンロードしたhttpd-2.4.41-win64-VC14.zipを解凍します。
解凍すると、Apache24というフォルダができていますので、それをCドライブ直下に移動します。
C:\Apache24配下に、confやhtdocsがある構成になります。
・httpd.confの編集
C:\Apache24\conf\httpd.confをエディタで開きます。
ServerNameを編集します。IPアドレスとポート番号(ふつうは80)は適宜変更します。
ServerName 端末のIPアドレス:80
PHP7モジュールをロードする設定も入れます。LoadModuleの一番下にでも追加しましょう。
LoadModule php7_module c:/php/php7apache2_4.dll
拡張子phpをPHPプログラムとして認識する設定を追加します。一番下に追加しましょう。
<FilesMatch "\.php$">
AddHandler php7-script .php
AddType application/x-httpd-php .php
</FilesMatch>
PHPIniDir C:/php/
・Apache起動
httpd.confを保存したら、Apacheを起動してみましょう。
C:\Apache24\bin\httpd.exe をダブルクリックします。
ブラウザを起動し、以下にアクセスします。
http://localhost/
「It Works!」と表示されれば、httpd起動に成功しています。
続いて、phpの動作確認です。Apacheのドキュメントルート(C:\Apache24\htdocs)に、phpinfo.phpというファイルを作成し、中身は以下のようにします。
<?php
phpinfo();
?>
ブラウザを起動し、以下にアクセスします。
http://localhost/phpinfo.php
PHPの動作状況が表で表示されると思います。Solrとcurlの拡張機能が有効になっていることを確認しましょう。
Curl拡張
Solr拡張
3.Solr本体のインストールと起動
・ダウンロードしたsolr-8.4.1.zipを解凍します。
solr-8.4.1ディレクトリができますので、Cドライブ直下に移動します。
C:\solr-8.4.1の下にbinやexampleができている構成になります。
・コレクションの作成
コレクションとは、インデックス構築の大きなくくりです。検索したい業務単位などにすればいいでしょう。ここでは、サンプルとして提供されているものを使います。
コマンドプロンプトを開き、以下のように実行していきましょう。
cd C:\solr-8.4.1
bin\solr.cmd start -e cloud ←対話形式で起動設定を行うコマンドです。
Welcome to the SolrCloud example!
This interactive session will help you launch a SolrCloud cluster on your local workstation.
To begin, how many Solr nodes would you like to run in your local cluster? (specify 1-4 nodes) [2]:←Enter
Ok, let's start up 2 Solr nodes for your example SolrCloud cluster.
Please enter the port for node1 [8983]:←Enter
Please enter the port for node2 [7574]:←Enter
Creating Solr home directory c:\solr-8.4.1\example\cloud\node1\solr
Cloning c:\solr-8.4.1\example\cloud\node1 into
c:\solr-8.4.1\example\cloud\node2
Starting up Solr on port 8983 using command:
"c:\solr-8.4.1\bin\solr.cmd" start -cloud -p 8983 -s "c:\solr-8.4.1\example\cloud\node1\solr"
Waiting up to 30 to see Solr running on port 8983
Starting up Solr on port 7574 using command:
"c:\solr-8.4.1\bin\solr.cmd" start -cloud -p 7574 -s "c:\solr-8.4.1\example\cloud\node2\solr" -z localhost:9983
Started Solr server on port 8983. Happy searching!
Waiting up to 30 to see Solr running on port 7574
Started Solr server on port 7574. Happy searching!
INFO - 2020-03-20 19:25:34.797; org.apache.solr.common.cloud.ConnectionManager; Waiting for client to connect to ZooKeeper
INFO - 2020-03-20 19:25:34.820; org.apache.solr.common.cloud.ConnectionManager; zkClient has connected
INFO - 2020-03-20 19:25:34.820; org.apache.solr.common.cloud.ConnectionManager; Client is connected to ZooKeeper
INFO - 2020-03-20 19:25:34.836; org.apache.solr.common.cloud.ZkStateReader; Updated live nodes from ZooKeeper... (0) -> (2)
INFO - 2020-03-20 19:25:34.852; org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider; Cluster at localhost:9983 ready
Now let's create a new collection for indexing documents in your 2-node cluster.
Please provide a name for your new collection: [gettingstarted]
techproducts
How many shards would you like to split techproducts into? [2]←Enter
How many replicas per shard would you like to create? [2]←Enter
Please choose a configuration for the techproducts collection, available options are:
_default or sample_techproducts_configs [_default]
sample_techproducts_configs
Created collection 'techproducts' with 2 shard(s), 2 replica(s) with config-set 'techproducts'
Enabling auto soft-commits with maxTime 3 secs using the Config API
POSTing request to Config API: http://localhost:8983/solr/techproducts/config
{"set-property":{"updateHandler.autoSoftCommit.maxTime":"3000"}}
Successfully set-property updateHandler.autoSoftCommit.maxTime to 3000
SolrCloud example running, please visit: http://localhost:8983/solr
これだけで、裏ではもうSolrサーバが起動しています。
ブラウザから管理画面にアクセスしてみましょう。
こんな画面が出ればOKです。
Solrでは、サンプル用として、techproductsというコレクションを準備してくれています。本来はスキーマ設計が必要らしく、なかなかそのあたりは難しそうなので割愛し、今回はサンプルをそのまま使わせてもらいました。
4.Solrのインデックス構築
では、そのサンプルのコレクションに、検索対象となるドキュメントをインデックス化していきましょう。
Linux版のSolrでは、postという簡易コマンドが用意してあり、それを使ってインデックスを作れます。Windows版には、post.jarというJavaが用意してあり、javaコマンドを使うことになります。以下のコマンドをコマンドプロンプトから実行します。事前にc:\solr-8.4.1にcdしておいてください。
java -jar -Dc=techproducts -Dauto -Drecursive=10 example\exampledocs\post.jar example\exampledocs\*
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/solr/techproducts/update...
Entering auto mode. File endings considered are xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log
Entering recursive mode, max depth=10, delay=0s
POSTing file books.csv (text/csv) to [base]
POSTing file books.json (application/json) to [base]/json/docs
POSTing file gb18030-example.xml (application/xml) to [base]
POSTing file hd.xml (application/xml) to [base]
POSTing file ipod_other.xml (application/xml) to [base]
POSTing file ipod_video.xml (application/xml) to [base]
POSTing file manufacturers.xml (application/xml) to [base]
POSTing file mem.xml (application/xml) to [base]
POSTing file money.xml (application/xml) to [base]
POSTing file monitor.xml (application/xml) to [base]
POSTing file monitor2.xml (application/xml) to [base]
POSTing file more_books.jsonl (application/json) to [base]/json/docs
POSTing file mp500.xml (application/xml) to [base]
POSTing file post.jar (application/octet-stream) to [base]/extract
POSTing file sample.html (text/html) to [base]/extract
POSTing file sd500.xml (application/xml) to [base]
POSTing file solr-word.pdf (application/pdf) to [base]/extract
POSTing file solr.xml (application/xml) to [base]
POSTing file test_utf8.sh (application/octet-stream) to [base]/extract
POSTing file utf8-example.xml (application/xml) to [base]
POSTing file vidcard.xml (application/xml) to [base]
21 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/techproducts/update...
Time spent: 0:00:03.108
このメッセージを見てわかるとおり、インデックス構築も含めてすべてREST化してあるようです。すごいですね。そのうちAPIを直接たたくようなところまでやってみようと思います。
では、作ったインデックスを管理画面から検索してみましょう。
Collection Selectからtechproductsを選択します。
Queryをクリックします。
「q」欄に「foundation」と入力し、下の「Execute Query」をクリックすると、右に検索結果が出ます。
jsonで返ってくるんですね。GETメソッドで直接APIを叩いてみましょう。
http://localhost:8983/solr/techproducts/select?q=foundation
こんな感じです。
5.Solrの停止と起動
Solrを停止するには、コマンドプロンプトから以下のコマンドを実行します。
bin\solr.cmd stop -all
起動するには、以下のコマンドです。
bin\solr.cmd start -cloud -p 8983 -s c:\solr-8.4.1\example\cloud\node1\solr
bin\solr.cmd start -cloud -p 7574 -s c:\solr-8.4.1\example\cloud\node2\solr -z localhost:9983
次回は、php-solrを使った、クライアントプログラムを試してみたいと思います。
ではでは。今日はこれまで。