それでも気分は高専生

元高専生が自分のやってきたことを記事として残すためのてきとーなブログ

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イメージを利用して環境を構成していきます。

hub.docker.com

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 でクエリを投げられます。

f:id:takahiro0914:20200805001157p:plain
クエリの記述画面

クエリでは以下のものが指定できます。

  • q: クエリを記述
    • フィールド名:値 AND フィールド名:値のように様々な演算子やフィールドを組み合わせることが可能
    • またフィールド名:値^重み OR フィールド名:値^重みとすることで、細かい検索結果の調整も可能
  • fq: クエリ検索にかけるフィルタ
  • fl: 検索結果として返すフィールドの値
  • sort: ソートに利用するフィールド、何も入力しないとSolrのスコアリング順
  • debugQuery: クエリのデバッグが見られる、クエリに利用する値のトークナイズなどが見られて便利
  • hl: 検索結果のハイライティングを利用するか否か (ヒットしたワードが強調されて表示されるやつ)
  • facet: ファセットを結果に含めるか否か

フロントエンド開発編へ続く...