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

 

f:id:ponkotsu_engine:20200320195527p:plain

 

 

 

1.資材の取得

・Java1.8

Solrを動かすのに必要となります。環境に合ったJREOracleサイトから入手し入れましょう。これはメジャーなので詳細は省きます。


・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/

f:id:ponkotsu_engine:20200320235916p:plain



 

 


PHP
7.1を使います。アーカイブからダウンロード。Apacheと連携する場合は必ずスレッドセーフ版。ファイル名にntfとあるのはNon-Thread-Safeなので違います。紛らわしいですね。あと、32bit/64bitを間違えないように。
https://windows.php.net/downloads/releases/archives/

 

f:id:ponkotsu_engine:20200321000023p:plain

 

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

 

f:id:ponkotsu_engine:20200321000127p:plain


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_curlcurl拡張機能です。


環境変数追加
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

拡張子phpPHPプログラムとして認識する設定を追加します。一番下に追加しましょう。

 

<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起動に成功しています。

 

f:id:ponkotsu_engine:20200320192707p:plain

 


続いて、phpの動作確認です。Apacheのドキュメントルート(C:\Apache24\htdocs)に、phpinfo.phpというファイルを作成し、中身は以下のようにします。

<?php
phpinfo();
?>


ブラウザを起動し、以下にアクセスします。
http://localhost/phpinfo.php


PHPの動作状況が表で表示されると思います。Solrとcurl拡張機能が有効になっていることを確認しましょう。

f:id:ponkotsu_engine:20200320193448p:plain


 Curl拡張

f:id:ponkotsu_engine:20200320193540p:plain

 

Solr拡張

f:id:ponkotsu_engine:20200320193656p:plain

 


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サーバが起動しています。

 

ブラウザから管理画面にアクセスしてみましょう。

http://localhost:8983/solr

 

こんな画面が出ればOKです。

f:id:ponkotsu_engine:20200320195703p:plain

 

 

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を直接たたくようなところまでやってみようと思います。

 

 

では、作ったインデックスを管理画面から検索してみましょう。

http://localhost:8983/solr

 

Collection Selectからtechproductsを選択します。

f:id:ponkotsu_engine:20200320200804p:plain

 

Queryをクリックします。

f:id:ponkotsu_engine:20200320200849p:plain

 

「q」欄に「foundation」と入力し、下の「Execute Query」をクリックすると、右に検索結果が出ます。

f:id:ponkotsu_engine:20200320201012p:plain

 

jsonで返ってくるんですね。GETメソッドで直接APIを叩いてみましょう。

http://localhost:8983/solr/techproducts/select?q=foundation

f:id:ponkotsu_engine:20200320201156p:plain

 

 

こんな感じです。

 

 

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を使った、クライアントプログラムを試してみたいと思います。

 

ではでは。今日はこれまで。