SolrでConflの記事を検索 - Solrの環境構築編
Solrの環境構築編
SolrでConflの記事を検索 - それでも気分は高専生の個別実装第二弾です。
前回の記事ではCLIを使ってConflから記事を取得し、Solrにインデクシングする仕組みを作るところまでやりました。
しかしこのままでは、Solr側がどのようなデータを受け取っていいかわかりません。
そこでSolr側の受け取り準備をしていきます。
ディレクトリ構成
最初にイメージを掴みやすくするために、ディレクトリ構成を記述しておきます。
. |-- README.md |-- docker-compose.yaml `-- solr |-- data |-- managed-schema `-- web.xml
docker-composeの用意
今回はSolrの公式Dockerイメージを利用して環境を構成していきます。
version: '3' services: solr: image: solr:8.5 container_name: 'solor_sample' ports: - "8983:8983" volumes: - ./solr/data:/var/solr/data - ./solr/web.xml:/opt/solr-8.5.2/server/solr-webapp/webapp/WEB-INF/web.xml restart: always
Solrにはコアと呼ばれるインデクシングするための、データ倉庫の単位みたいなものがあります。
/var/solr/data
にはコアが格納されていて、インデクシングされたデータとそのメタデータなどが入っています。
ここではコアの格納されたディレクトリをホストにマウントすることで一度インデクシングされたデータを永続化しています。
また、opt/solr-8.5.2/server/solr-webapp/webapp/WEB-INF/web.xml
にはSolrのサーバとしての設定が記述されており、後述のフロントエンドからの利用に必要になるCORSの設定を記述しています。
managed-schemaを用意
Solrはインデクシングされるドキュメントがどんなフィールドを持っているか(タイトルや著者、作成日時、本文、etc...)?をスキーマという形で指定します。
スキーマはmanaged-schemaというXMLファイルでコア毎に管理され、/solr/data/コア名/conf/managed-schema
に保存されます。
今回定義したフィールドはこんな感じです。
... <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <!-- docValues are enabled by default for long type so we don't need to index the version field --> <field name="type" type="string" indexed="false" stored="true"/> <field name="title" type="text_ja" indexed="true" stored="true"/> <field name="space_name" type="string" indexed="true" stored="true"/> <field name="createdBy_username" type="string" indexed="true" stored="true"/> <field name="createdBy_displayName" type="string" indexed="true" stored="true"/> <field name="view" type="text_ja" indexed="true" stored="true"/> <field name="url" type="string" indexed="false" stored="true"/> <field name="labels" type="string" indexed="true" stored="true" multiValued="true"/> ...
一部解説しておきますと、
filed.type = "string"
は文字列で、インデクシング時に内部でトークナイズ(形態素解析されてバラバラの単語に分割)されないものです。
filed.type = "text_ja"
は文字列で、インデクシング時に内部でトークナイズされ、その際に利用される辞書は日本語のものとなります。
他にも数値や日時など様々なfield.typeがあります。
また、field.indexed=true
はコア内でインデクシングの対象とするか否かを指定しています。
インデクシングのオーバーヘッドにも繋がるので、検索対象としたいものにだけtrue
とすると良いらしいです。
stored='true'
はインデクシングしたフィールドをSolr内部で保存するか否かを指定しています。
あくまで保存するだけなので、これだけでは検索対象のフィールドとしては不十分であることに注意してください。
クライアントに見せたいフィールドにつけるといいです。
最後にmutiValued="true"
はそのフィールドがリストであることを示します。
ここでは一つの記事が複数のラベルを保持する可能性があるため、指定しています。
Solrの起動
では早速Solrの方を動かしていきましょう。
# Solrの起動 $ docker-compose up -d # conflというCoreを作成 $ docker-compose exec solr bin/solr create_core -c confl # 予め作っておいたmanaged-schemaをコピー $ cp solr/managed-schema solr/data/confl/conf/managed-schema
ここからは管理コンソールからの作業になります。
http://localhost:8983/solr/#/~confl
を開き、CoreAdmin → conflを選択 → Reloadボタンを押下することで、managed-schemaをコアに反映させます。
Core Selector → confl → Files → managed-schemaで変更が反映されていることを確認しましょう。
インデクシング
これで準備が完了しました。
SolrでConflの記事を検索 - インデクシングCLI編 - それでも気分は高専生
で開発したインデクシングCLIを使ってSolrへConflの記事を流し込んでいきましょう。
$ go run *.go import -u <Conflのユーザ名> -p <Conflのパスワード>
クエリを投げる
インデクシングが一通り終わったら、これで検索できるようになっているはずです。
管理コンソールのCore Selector → confl → Query でクエリを投げられます。
クエリでは以下のものが指定できます。
- q: クエリを記述
フィールド名:値 AND フィールド名:値
のように様々な演算子やフィールドを組み合わせることが可能- また
フィールド名:値^重み OR フィールド名:値^重み
とすることで、細かい検索結果の調整も可能
- fq: クエリ検索にかけるフィルタ
- 後述のファセット絞り込みなどに使用
- ファセットでの利用はqueryResultCacheへの影響を与えないため単純にANDをとるのではなく、fqを使うのが望ましい
- Solrのキャッシュについて調査したことまとめ - YOMON8.NET
- fl: 検索結果として返すフィールドの値
- sort: ソートに利用するフィールド、何も入力しないとSolrのスコアリング順
- debugQuery: クエリのデバッグが見られる、クエリに利用する値のトークナイズなどが見られて便利
- hl: 検索結果のハイライティングを利用するか否か (ヒットしたワードが強調されて表示されるやつ)
- facet: ファセットを結果に含めるか否か
フロントエンド開発編へ続く...