Apache Solr でとりあえず全文検索

前回記事では、Apache Solrを起動するところまでいきました。起動しただけではなんともなりませんので、まずは全文検索をできるようにしてみましょう。

Apache Solrで全文検索をできるようにするためには、大体以下のようなプロセスがあります。

  1. Apache Solrをインストール&起動
  2. コアの作成
  3. 検索項目の設定(省略可)
  4. 検索対象ドキュメントの登録

このうち「3. 検索項目の設定」を行うことによって、より便利な検索ができるようになりますが、省略してもそこそこ便利な検索ができます。そこで、 まずは、ここをスキップして、「2.コアの作成」をした上で検索対象ドキュメントの登録をしてみましょう。

2. コアの作成

コアの作成は、Webインターフェイスからでもできるらしいのですが、後々のことを考えて、CUI(コマンドラインインターフェイス)でやってみましょう。前回記事のように、SolrのディレクトリでPower ShellやWSLターミナルなどを開いた上で、

Power Shellの場合は、

> bin/solr create -c minhon

WSLターミナルの場合は(多分MacOSやLinuxでも同様に)

$ ./bin/solr create -c minhon

としてみてください。そうすると、

「Created new core 'minhon'」などと表示され、「minhon」というコアができます。

コアができたどうかを確認するべく、再び http://localhost:8983/ にアクセスしてみましょう。

ここで、左側のメニューの「Core admin」をクリックすると、先ほど作った「minhon」が以下のように表示されるはずです。

f:id:digitalnagasaki:20200125133730p:plain
core admin

そして、左側のメニューの「Core selector」をクリックすると

f:id:digitalnagasaki:20200125133915p:plain
core selector

以下のように、先ほど作った「minhon」が選べるようになっているはずです。

f:id:digitalnagasaki:20200125134009p:plain
core selector minhon

これで、コアができました。そうしましたら、次は、このコアに対してドキュメントを登録していくことになります。

3. 検索項目の設定(省略可)

今回は省略します。省略すると、自動的に無難な項目設定が行われます。検索の利便性を高めたい場合には、これを自分で詳細に行うことになります。

4. 検索対象ドキュメントの登録

検索対象ドキュメントの登録は、Webインターフェイスからでもできるようですが、大量ドキュメントの登録にはあまり向いていないので、ここではCUIで行うことにします。

準備(Power Shellのための):

最近は、LinuxやMacOSでこういうことを行う場合、curlというコマンドを使うことが多く、割と便利なのですが、PowerShellでもインストールすれば使えますので、Power Shellで行う場合にはcurlをこちらからインストールしましょう。

(なお、Power Shellでは標準でもcurlというコマンドが使えますが、標準のコマンドはcurlではない別のコマンドのエイリアスになっているというおそろしい状態ですので、気をつけてください。Power Shellでcurlを他のOSと同様に使うためには、PATHの設定をすればいいのですが、エイリアスを外す操作も必要かもしれず、ちょっと面倒です。上記のcurlをインストールした後に curl.exeという風にコマンドを打てば、インストールした方を使ってくれるようですので、以下ではPower Shellの場合は curl.exe、それ以外は curlとして、それぞれコマンドをコピペできるように用意していきます。)

ドキュメントの用意:

最近では、この種のデータの登録はJSONでデータを作るのが一般的です。特にPythonを使っている場合、リスト+辞書を作ればほぼそのまま使えますので、色々楽です。今回は、「みんなで翻刻」の「石本コレクション」の翻刻データをベースにしてご用意したのがこちらです。「みんなで翻刻」の利用条件はCC BY-SAですので、形式を改変したものも CC BY-SAとしてご利用ください。このファイルを minhon.json というファイル名で保存したという前提で続けます。

Power Shellの場合:

> curl.exe "http://localhost:8983/solr/minhon/update?commit=true" --data-binary "@minhon.json" -H 'Content-type:text/json;charset=utf-8'

WSLのUbuntu18やMac OS等の場合:

$ curl "http://localhost:8983/solr/minhon/update?commit=true" --data-binary "@minhon.json" -H 'Content-type:text/json;charset=utf-8'

という風にすると、ドキュメントが minhonコアに登録されて検索できるようになります。検索は、まずは Webインターフェイスからやってみましょう。再び http://127.0.0.1:8983/ にアクセスしてみてください。

そして、 Core selector で「minhon」を選ぶと、以下のように登録ドキュメント数が表示されているはずですが、いかがでしょうか。(!この数字は、以下のものと皆さんのお手元のものは異なる場合がありますが、1以上でしたら大丈夫ですのであまり気にしないでください!)

f:id:digitalnagasaki:20200125141937p:plain
doc_number

これがうまくいっていたら、左側のメニューの「query」をクリックして、「Execute Query」ボタンをクリックしてください。そうすると以下のように、全てを対象にして検索した結果が表示されるはずです。検索結果は標準ではこのようにJSON形式で戻ってきます。"response"⇒"numFound"でヒットした件数が表示されているはずです。

f:id:digitalnagasaki:20200125142338p:plain
numfound

上記の画面でまずもう少し注目していただきたいのは、「q」というテキストエリアと「rows」というテキスト入力フィールドです。それぞれ「:」と「10」となっています。「rows」は、検索結果の表示数ですので、適宜増やしたり減らしたりしてください。(増やしすぎるとブラウザがフリーズするので注意してください)。「q」は、検索項目と検索語を入力できるようになっていて、「検索項目:検索語」という風に書くことになっているのですが、「:」で、すべての項目のすべての言葉、という風に検索できます。ここで例えば「project:"石本"」という風に入力して「Execute Query」ボタンをクリックすると、「project」項目に「石本」が含まれるドキュメントがヒットします。

f:id:digitalnagasaki:20200125143028p:plain
query_example

では次に、本文を検索してみましょう。本文のフィールドは、このデータではいくつか用意されていますが、textConnというのフィールドが一番検索しやすいものですので、「textConn:富山」として検索してみましょう。そうすると、以下のように68件ヒットします。富山が68件も!・・・と思ってヒットしたデータをよくみてみると、どうやら「富士山」も一緒にヒットしているみたいです。

f:id:digitalnagasaki:20200125145608p:plain
toyama1

つまり、文字を分割してそれらをAND検索してしまっているようです。これをきちんと「富山」として検索したい時は「textConn:"富山"」のように、検索語を二重引用符で囲めば、その文字列として検索してくれるようになります。

f:id:digitalnagasaki:20200125150123p:plain
toyama2

そうすると、「"numFound":3」となりますね。この検索結果には皆、文字列「富山」が含まれているはずです。

ここでもう一つ注目していただきたいのは、以下の黄色いマーカーで囲んだ箇所です。このURLが、この検索を行うためのURLということになります。

f:id:digitalnagasaki:20200125150555p:plain
searchurl

Power Shellなら

> curl.exe 'http://127.0.0.1:8983/solr/minhon/select?q=textConn%3A%22%E5%AF%8C%E5%B1%B1%22'

WSL UbuntuやMacOS、Linux等では

$ curl 'http://127.0.0.1:8983/solr/minhon/select?q=textConn%3A%22%E5%AF%8C%E5%B1%B1%22'

という風にすると、JSONで検索結果が戻ってくるところを確認できると思います。

なお、JSON形式で得られるよりも、もっと簡単にエクセルなどに取り込んでしまいたい、という人には、検索メニューの中の「wt」というセレクタから「csv」を選択することもできますので、こちらも試してみてください。

f:id:digitalnagasaki:20200125151134p:plain
csv

ここでも、URLの箇所を確認してみてください。URLに「&wt=csv」というのが追加されていると思います。URLで検索結果を得る場合には、このようにしてパラメータを追加することで色々な形式のデータを得ることができます。

ということで、とりあえずドキュメントを登録して検索するところまではできるようになりました。今回はここまでとしましょう。