演習 1: Techproducts データのインデックス作成

この演習では、Solr を 2 ノードクラスタ (両方のノードが同じマシン上) として起動し、起動時にコレクションを作成する方法を説明します。次に、Solr に付属しているサンプルデータをいくつかインデックス作成し、基本的な検索を行います。

SolrCloud モードで Solr を起動する

Solr を起動するには、Unix または MacOS で bin/solr start -e cloud を実行し、Windows で bin\solr.cmd start -e cloud を実行します。

これにより、マシン上で 2 つの Solr「サーバー」を起動する対話型セッションが開始されます。このコマンドには、入力を求めることなく実行するオプション (-noprompt) がありますが、デフォルトの 2 つを変更する必要があるため、このオプションは使用しません。

$ bin/solr 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]:

最初のプロンプトでは、実行するノードの数を尋ねられます。最後の行の末尾にある [2] に注目してください。これがデフォルトのノード数です。この例では 2 つで問題ないので、単に Enter キーを押します。

Ok, let's start up 2 Solr nodes for your example SolrCloud cluster.
Please enter the port for node1 [8983]:

これが最初のノードが実行されるポートになります。マシンでポート 8983 で実行されているものが他にあることがわかっていない限り、Enter キーを押してこのデフォルトオプションも受け入れます。既にそのポートを使用している場合は、別のポートを選択するように求められます。

Please enter the port for node2 [7574]:

これが 2 番目のノードが実行されるポートになります。繰り返しになりますが、マシンでポート 7574 で実行されているものが他にあることがわかっていない限り、Enter キーを押してこのデフォルトオプションも受け入れます。既にそのポートを使用している場合は、別のポートを選択するように求められます。

Solr はこれで初期化され、これら 2 つのノードで実行を開始します。スクリプトは、参考のため使用したコマンドを出力します。

Starting up 2 Solr nodes for your example SolrCloud cluster.

Creating Solr home directory /solr-{solr-full-version}/example/cloud/node1/solr
Cloning /solr-{solr-full-version}/example/cloud/node1 into
   /solr-{solr-full-version}/example/cloud/node2

Starting up Solr on port 8983 using command:
"bin/solr" start -cloud -p 8983 -s "example/cloud/node1/solr"

Waiting up to 180 seconds to see Solr running on port 8983 [\]
Started Solr server on port 8983 (pid=34942). Happy searching!


Starting up Solr on port 7574 using command:
"bin/solr" start -cloud -p 7574 -s "example/cloud/node2/solr" -z localhost:9983

Waiting up to 180 seconds to see Solr running on port 7574 [\]
Started Solr server on port 7574 (pid=35036). Happy searching!

INFO  - 2017-07-27 12:28:02.835; org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider; Cluster at localhost:9983 ready

2 つの Solr インスタンスが 2 つのノードで起動したことに注意してください。SolrCloud モードで起動し、外部 ZooKeeper クラスタに関する詳細を定義しなかったため、Solr は独自の ZooKeeper を起動し、両方のノードをそれに接続します。

起動が完了すると、データをインデックス作成に使用するコレクションを作成するように求められます。

Now let's create a new collection for indexing documents in your 2-node cluster.
Please provide a name for your new collection: [gettingstarted]

ここが、デフォルトオプションから逸脱する最初の場所です。このチュートリアルでは、Solr に含まれている「techproducts」データと呼ばれるサンプルデータをいくつかインデックス作成するように求めます。後で作成する他のコレクションと簡単に区別できるように、コレクションに「techproducts」という名前を付けましょう。プロンプトで techproducts と入力し、Enter キーを押します。

How many shards would you like to split techproducts into? [2]

これは、2 つのノード間でインデックスを分割する シャード の数を尋ねています。「2」(デフォルト) を選択すると、インデックスが両方のノードに比較的均等に分割されることを意味します。これは開始するのに良い方法です。Enter キーを押してデフォルトを受け入れます。

How many replicas per shard would you like to create? [2]

レプリカは、フェイルオーバーに使用されるインデックスのコピーです (「Solr 用語集の定義」も参照してください)。ここでも、デフォルトの「2」で開始するには問題ないので、Enter キーを押してデフォルトを受け入れます。

Please choose a configuration for the techproducts collection, available options are:
_default or sample_techproducts_configs [_default]

デフォルトオプションから逸脱するもう 1 つのポイントに到達しました。Solr には、すぐに使用できる 2 つのサンプル設定ファイルセット (configset と呼ばれます) があります。

コレクションにはconfigsetが必要です。configsetには、少なくともSolrの2つの主要な構成ファイル、つまりスキーマファイル(managed-schema.xmlまたはschema.xmlという名前)とsolrconfig.xmlが含まれている必要があります。ここで問題となるのは、どのconfigsetから開始するかです。_defaultは必要最小限のオプションですが、コレクションに付けた名前と同じ"techproducts"という名前が含まれているものがあります。このconfigsetは、使用したいサンプルデータをサポートするように特別に設計されているため、プロンプトでsample_techproducts_configsと入力し、Enterキーを押してください。

この時点で、Solrはコレクションを作成し、発行したコマンドを再び画面に出力します。

Created collection 'techproducts' with 2 shard(s), 2 replica(s) with config-set 'techproducts'

SolrCloud example running, please visit: https://127.0.0.1:8983/solr

おめでとうございます! Solrでデータを使用する準備ができました!

Solrが実行されていることを確認するには、WebブラウザでSolr Admin UIを起動してください。https://127.0.0.1:8983/solr/ これがSolrを管理するための主要な開始点です。

Solrは現在、ポート7574とポート8983で2つの「ノード」を実行しています。techproductsというコレクションが自動的に作成されています。これは2つのシャードコレクションであり、それぞれに2つのレプリカがあります。

Admin UIのCloudタブには、コレクションがわかりやすく図示されています。

tutorial solrcloud
図1. SolrCloudダイアグラム

Techproductsデータをインデックス化する

Solrサーバーは起動して実行されていますが、まだデータが含まれていないため、クエリを実行することはできません。

Solrには、さまざまな種類のドキュメントのインデックス作成を容易にするためにbin/solr postツールが含まれています。以下のインデックス作成の例では、このツールを使用します。

以下の例を実行するには、Solrのインストールディレクトリをルートとするコマンドシェルが必要です。Solrを起動したシェルで問題ありません。

インデックスを作成するデータは、example/exampledocsディレクトリにあります。ドキュメントはさまざまなドキュメント形式(JSON、CSVなど)で混在していますが、幸いなことにすべてを一度にインデックス化できます。

Linux/Mac
$ bin/solr post -c techproducts example/exampledocs/*
Windows
$ java -jar -Dc=techproducts -Dauto example\exampledocs\post.jar example\exampledocs\*

次のような出力が表示されるはずです。

SimplePostTool version 5.0.0
Posting files to [base] url https://127.0.0.1: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
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 https://127.0.0.1:8983/solr/techproducts/update...
Time spent: 0:00:00.822

再度、おめでとうございます!Solrにデータが追加されました!

これで検索を開始する準備ができました。

基本的な検索

Solrは、RESTクライアント、curl、wget、Chrome POSTMANなどを介して、また多くのプログラミング言語で利用可能なネイティブクライアントを介してクエリを実行できます。

Solr Admin UIには、techproductsコレクション用のQueryタブ(https://127.0.0.1:8983/solr/#/techproducts/query)を介したクエリビルダーインターフェースが含まれています。フォームの内容を何も変更せずにExecute Queryボタンをクリックすると、JSON形式で10個のドキュメントが取得されます。

Solr Quick Start: techproducts Query screen with results
図2. クエリ画面

Admin UIによってSolrに送信されたURLは、上記のスクリーンショットの右上付近に薄いグレーで表示されます。それをクリックすると、ブラウザに生のレスポンスが表示されます。

curlを使用するには、コマンドラインでブラウザに表示されているURLを引用符で囲んで指定します。

$ curl "https://127.0.0.1:8983/solr/techproducts/select?indent=on&q=*:*"

ここで何が起こっているかというと、インデックス内のすべてのドキュメントを要求する特別な構文(*:*)を持つSolrのクエリパラメータ(q)を使用しているということです。ただし、すべてのドキュメントが返されるわけではありません。これは、フォームで確認できるrowsというパラメータのデフォルトが10になっているためです。必要に応じて、UIまたはデフォルトでパラメータを変更できます。

Solrには非常に強力な検索オプションがありますが、このチュートリアルではすべてを網羅することはできません。しかし、最も一般的なタイプのクエリのいくつかを取り上げることができます。

単一の用語の検索

用語を検索するには、Solr Admin UIのQuery画面で、qパラメータの値として入力し、*:*を検索する用語に置き換えます。

"foundation"と入力し、再度Execute Queryをクリックしてください。

curlを使用する場合は、次のようなものを入力します。

$ curl "https://127.0.0.1:8983/solr/techproducts/select?q=foundation"

次のようなものが表示されます。

{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":8,
    "params":{
      "q":"foundation"}},
  "response":{"numFound":4,"start":0,"maxScore":2.7879646,"docs":[
      {
        "id":"0553293354",
        "cat":["book"],
        "name":"Foundation",
        "price":7.99,
        "price_c":"7.99,USD",
        "inStock":true,
        "author":"Isaac Asimov",
        "author_s":"Isaac Asimov",
        "series_t":"Foundation Novels",
        "sequence_i":1,
        "genre_s":"scifi",
        "_version_":1574100232473411586,
        "price_c____l_ns":799}]
}}

レスポンスは、4つのヒットがあること("numFound":4)を示しています。上記のサンプル出力には1つのドキュメントしか含めていませんが、4つのヒットは返されるrowsパラメータのデフォルトの10よりも少ないため、4つすべて表示されるはずです。

ドキュメントの前のresponseHeaderに注目してください。このヘッダーには、検索に設定したパラメータが含まれます。デフォルトでは、このクエリに設定したパラメータのみが表示されます。この場合は、クエリ用語のみです。

返されたドキュメントには、インデックス化された各ドキュメントのすべてのフィールドが含まれています。これもデフォルトの動作です。レスポンスのフィールドを制限したい場合は、フィールド名のカンマ区切りリストを受け入れるflパラメータを使用できます。これは、Admin UIのクエリフォームで使用可能なフィールドの1つです。

"fl"ボックスに(引用符なしで)"id"と入力し、再度Execute Queryをクリックします。または、curlで指定します。

$ curl "https://127.0.0.1:8983/solr/techproducts/select?q=foundation&fl=id"

一致するレコードのIDのみが返されるはずです。

フィールド検索

Solrのすべてのクエリは、何らかのフィールドを使用してドキュメントを検索します。多くの場合、同時に複数のフィールドにまたがってクエリを実行したいと考えており、これはこれまでの"foundation"クエリで行ってきたことです。これは、この構成セットですでに設定されているコピーフィールドを使用することで可能です。コピーフィールドについては、演習2で詳しく説明します。

ただし、クエリを単一のフィールドに制限したい場合があります。これにより、クエリの効率が向上し、ユーザーにとって結果がより関連性の高いものになる可能性があります。

小さなサンプルデータセットのデータの多くは、製品に関連しています。インデックス内のすべての「electronics」製品を見つけたいとしましょう。Query画面で、qボックスに(引用符なしで)"electronics"と入力し、Execute Queryをクリックします。次のような14個の結果が表示されるはずです。

{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":6,
    "params":{
      "q":"electronics"}},
  "response":{"numFound":14,"start":0,"maxScore":1.5579545,"docs":[
      {
        "id":"IW-02",
        "name":"iPod & iPod Mini USB 2.0 Cable",
        "manu":"Belkin",
        "manu_id_s":"belkin",
        "cat":["electronics",
          "connector"],
        "features":["car power adapter for iPod, white"],
        "weight":2.0,
        "price":11.5,
        "price_c":"11.50,USD",
        "popularity":1,
        "inStock":false,
        "store":"37.7752,-122.4232",
        "manufacturedate_dt":"2006-02-14T23:55:59Z",
        "_version_":1574100232554151936,
        "price_c____l_ns":1150}]
}}

この検索では、インデックス化されたフィールドのどこかに「electronics」という用語を含むすべてのドキュメントが検索されます。ただし、上記から、「category」を表すcatフィールドがあることがわかります。カテゴリが「electronics」のドキュメントのみを検索するように制限すると、結果がユーザーにとってより正確になります。

Admin UIのqフィールドでクエリをcat:electronicsになるように更新します。これで12個の結果が得られます。

{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":6,
    "params":{
      "q":"cat:electronics"}},
  "response":{"numFound":12,"start":0,"maxScore":0.9614112,"docs":[
      {
        "id":"SP2514N",
        "name":"Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133",
        "manu":"Samsung Electronics Co. Ltd.",
        "manu_id_s":"samsung",
        "cat":["electronics",
          "hard drive"],
        "features":["7200RPM, 8MB cache, IDE Ultra ATA-133",
          "NoiseGuard, SilentSeek technology, Fluid Dynamic Bearing (FDB) motor"],
        "price":92.0,
        "price_c":"92.0,USD",
        "popularity":6,
        "inStock":true,
        "manufacturedate_dt":"2006-02-13T15:26:37Z",
        "store":"35.0752,-97.032",
        "_version_":1574100232511160320,
        "price_c____l_ns":9200}]
     }}

curlを使用すると、このクエリは次のようになります。

curl "https://127.0.0.1:8983/solr/techproducts/select?q=cat:electronics"

複数語の句を検索するには、二重引用符で囲みます:q="ここに複数の用語"。たとえば、Admin UIのqボックスに引用符で囲んで「CAS latency」を検索します。

curlで実行する場合は、用語間のスペースをURL内で"+"に変換する必要があることに注意してください。

$ curl "https://127.0.0.1:8983/solr/techproducts/select?q=\"CAS+latency\""

2つの結果が得られます。

{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":7,
    "params":{
      "q":"\"CAS latency\""}},
  "response":{"numFound":2,"start":0,"maxScore":5.937691,"docs":[
      {
        "id":"VDBDB1A16",
        "name":"A-DATA V-Series 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - OEM",
        "manu":"A-DATA Technology Inc.",
        "manu_id_s":"corsair",
        "cat":["electronics",
          "memory"],
        "features":["CAS latency 3,   2.7v"],
        "popularity":0,
        "inStock":true,
        "store":"45.18414,-93.88141",
        "manufacturedate_dt":"2006-02-13T15:26:37Z",
        "payloads":"electronics|0.9 memory|0.1",
        "_version_":1574100232590852096},
      {
        "id":"TWINX2048-3200PRO",
        "name":"CORSAIR  XMS 2GB (2 x 1GB) 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) Dual Channel Kit System Memory - Retail",
        "manu":"Corsair Microsystems Inc.",
        "manu_id_s":"corsair",
        "cat":["electronics",
          "memory"],
        "features":["CAS latency 2,  2-3-3-6 timing, 2.75v, unbuffered, heat-spreader"],
        "price":185.0,
        "price_c":"185.00,USD",
        "popularity":5,
        "inStock":true,
        "store":"37.7752,-122.4232",
        "manufacturedate_dt":"2006-02-13T15:26:37Z",
        "payloads":"electronics|6.0 memory|3.0",
        "_version_":1574100232584560640,
        "price_c____l_ns":18500}]
  }}

検索の組み合わせ

デフォルトでは、単一のクエリで複数の用語や句を検索する場合、Solrはドキュメントが一致するためにそのうちの1つが存在することのみを要求します。より多くの用語を含むドキュメントは、結果リストで上位にソートされます。

用語または句が存在することを必須にするには、+(プラス)を前に付けます。逆に、用語または句の存在を禁止するには、-(マイナス)を前に付けます。

「electronics」と「music」の両方の用語を含むドキュメントを検索するには、Admin UIのQueryタブのqボックスに+electronics +musicと入力します。

curlを使用している場合は、`文字をURL内で予約された目的を持っているため、エンコードする必要があります(スペース文字のエンコード)。`のエンコードは次のようになります。

$ curl "https://127.0.0.1:8983/solr/techproducts/select?q=%2Belectronics%20%2Bmusic"

1つの結果のみが得られるはずです。

「electronics」という用語を含み、「music」という用語を**含まない**ドキュメントを検索するには、Admin UIのqボックスにelectronics -musicと入力します。curlの場合は、再度、`をURLエンコードして%2Bにします。

$ curl "https://127.0.0.1:8983/solr/techproducts/select?q=%2Belectronics+-music"

今回は13個の結果が得られます。

検索に関する詳細情報

Solrで利用可能な検索オプションの表面をかじったにすぎません。Solrの検索オプションの詳細については、クエリ構文とパーサーを参照してください。

演習1のまとめ

この時点で、Solrがデータをインデックス化する方法と、いくつかの基本的なクエリの実行方法を確認しました。結果のファセット化やスキーマの管理など、Solrの概念をさらに紹介する次の例に進むか、独自に進むかを選択できます。

このチュートリアルを続けない場合は、これまでにインデックス化したデータはほとんど価値がない可能性があります。インストールを削除してやり直すか、最初に開始したbin/solrスクリプトを使用して、このコレクションを削除できます。

$ bin/solr delete -c techproducts

次に、新しいコレクションを作成します。

$ bin/solr create -c <yourCollection> -s 2 -rf 2

開始した両方のSolrノードを停止するには、次のコマンドを発行します。

$ bin/solr stop -all

bin/solrを使用した起動/停止およびコレクションオプションの詳細については、Solrコントロールスクリプトリファレンスを参照してください。