第1回 Apache Solr 入門|Apache Solr ハンズオンセミナー | 拡張機能ライブラリー | KandaSearch

EXTENSIONS

第1回 Apache Solr 入門|Apache Solr ハンズオンセミナー
無料

ご利用にはKandaSearchへの
ユーザー登録(無料)が必要です

Misc
第1回 Apache Solr 入門|Apache Solr ハンズオンセミナー

最新バージョン: 1.2.0

開発者: RONDHUIT

ダウンロード数: 46

最終更新日: 2022-07-11

Copyright: RONDHUIT Co.,LTD

最新バージョン: 1.2.0

開発者: RONDHUIT

ダウンロード数: 46

最終更新日: 2022-07-11

Copyright: RONDHUIT Co.,LTD

Apache Solr ハンズオンセミナー「第1回 Apache Solr 入門」のスライドです。

第1回 Apache Solr 入門|Apache Solr ハンズオンセミナー

P01 表紙

第1回 Apache Solr 入門
Apache Solr ハンズオンセミナー
株式会社ロンウイット
関口宏司 @kojisays

P02 改訂履歴

2022年5月9日 初版
2022年5月20日 エクステンション利用に関する注意事項を追加。
2022年6月22日 Webアプリダウンロードの演習を追加。
2022年7月11日 1)本編の一部をAppendixに移動。2)KandaSearchの拡張機能メニュー変更に合わせ内容更新。

P03 ご注意

  • 本書演習やセミナー内で使用される辞書や設定ファイルなどの「エクステンション」は、 KandaSearch の利用規約 https://kandasearch.com/policy/terms の範囲内でご利用いただけます。

P04 本日の内容

  • [演習] 演習環境の準備
  • Apache Solr とは?
    • 事例
  • 情報検索の基礎
    • 日本語の特徴
  • 検索エンジンの構成要素
  • いろいろな比較から検索エンジンや Apache Solr の特徴を考える
    • RDBとの比較
    • Elasticsearchとの比較
    • 商用検索エンジンとの比較
  • Apache Solr の基本機能
    • インデクシング、検索、ハイライト、ファセット&絞り込み検索
  • [演習] Apache Solr を使ってみよう!
  • Q&A, アンケート

P05 [演習] 演習環境の準備

P06 [演習1] 検索エンジンプロジェクトの作成

これから Apache Solr のいろいろな機能を使っていきます。本セミナーでは Apache Solr 環境を簡単に準備できる KandaSearch を通じて Apache Solr を使っていきます。
そのためには、 https://kandasearch.com/ にログイン後、プロジェクトを作成します。

  1. https://kandasearch.com/ にログインします。
  2. 「プロジェクトを作成する」というボタンからプロジェクトを作成してみましょう。
    • プロジェクト名はわかりやすいものをつけましょう。日本語の名前も可能です。
    • 会社名(架空の名前でも可)などにしてもいいでしょう。
    • プロジェクト名は後から設定メニューでいくらでも変更が可能です。

P07 [演習1a] プロジェクト管理機能(オプション)

(お試しになりたい方のみお試しください。このステップを飛ばしても以降の[演習]には差し支えございません)

  1. プロジェクトメンバーに同僚の開発者を招待することができます。
    • 画面左の「メンバー」メニューから招待したい人のメールアドレスを入力して「管理者」または「ユーザー」の役割で招待できます。
  2. プロジェクトにアイコンを設定できます。
    • 画面左の「設定」メニューからプロジェクトのアイコンに使用する画像をアップロードできます。

P08 [演習2] 検索エンジンインスタンスを作成

作成したプロジェクト内に検索エンジンインスタンス、つまり Apache Solr を作成してみましょう。

  1. 画面左の「オーバービュー」メニューから「インスタンスを作成する」ボタンをクリックし、インスタンス作成ステップを開始します。
  2. プラン選択にて「一週間トライアル」(右下)を選んで次に進みます。
    • 一週間後に自動的に削除されます。
    • 「スタンドアロン」と「SolrCloud」が選択できますが、「スタンドアロン」を選びます。
  3. インスタンス情報入力にて「インスタンス名」と「インスタンスサブドメイン」、「IPアドレス範囲」を設定します。
    • 「インスタンスサブドメイン」はユニークである必要があります。プロジェクト名とインスタンス名に日本語等特殊文字を使用していない場合は、「自動生成」をクリックして自動で作成することができます。
    • 「IPアドレス範囲」に設定したIPアドレスからのみこの Apache Solr へのアクセスを許可するファイアウォールが設定されます。(最大4つ)
    • 最終確認で作成される検索エンジンインスタンスをご確認後、ボタンをクリックして作成し、1〜2分お待ちください。

P09 検索エンジンと Apache Solr

P10 Apache Solr とは?(1/2)

  • Apache License 2.0のOSS(オープンソース・ソフトウェア)の検索エンジン
    • OSSの検索エンジン・ライブラリである Apache Lucene のサブプロジェクトとして開始
  • 検索エンジン/情報検索(Information Retrieval)/全文検索(Full-text Search)とは?
    • 検索対象の文書テキストを、全文書・全フィールドに渡って横断的に検索
    (クエリの例)
    「2000年1月1日」から「2020年12月31日」までに作成され、かつ、著者が「山田太郎」さんで本文に「野球」または「サッカー」を含む全文書を検索

P11 Apache Solr とは?(2/2)

  • 特徴(抜粋)
    • Boolean検索(AND/OR/NOT)、フレーズ検索、空間検索、重み付け検索、絞り込み検索
    • Exactマッチ〜あいまい検索、類義語検索
    • ハイライト、ファセット、サジェスト、もしかして検索
    • オープンなインタフェース、カスタマイズ可能、大規模対応
  • 応用例
    • 書誌検索(図書館、論文、・・・)や特許検索
    • ECサイト
    • 企業内横断検索(ファイルサーバー+CRM・SFA・ERP+データベース+社内チャット)
    • 各種マッチングサイト(人材、不動産、M&A、婚活、・・・)
    • 施設検索
    • Webサイト検索
  • 事例
    • Adobe、AT&T、NASA、Bloomberg、CNET、Instagram、Netflix、Disney、eBay、Internet Archive、SAP Hybris、Salesforce、Zappos、国立国会図書館、大学、官公庁、自治体、etc.
    • 弊社お客様事例:https://www.rondhuit.com/customer-cases.html

P12 全文検索の方式

  • 順次検索方式

    • 文書の先頭から、クエリの文字列と順次比較する
    • LinuxのgrepコマンドやRDBのlike検索
  • 転置インデックス方式

    • あらかじめ検索対象の文書からインデックスを作っておく
    • 文書にラベルを付け、ラベルで文書を引けるようにインデックスを作成

P13 文書へのラベル付けの方法

検索対象文書

  • 「ホームランダービーに日本人選手では初となるエンゼルスの大谷翔平選手。」

人手によるラベル抽出

  • ホームラン、大谷翔平、エンゼルス、ダービー

コンピューターによるラベル抽出

  • ホームラン、ダービー、に、日本人、選手、では、初、と、なる、エンゼルス、の、大谷翔平、選手、。

P14 転置インデックスの作り方

手順(1)

文書ID 検索対象文書
1 カツオはサザエの弟
2 サザエはワカメの姉
3 ワカメはカツオの妹

手順(2)

カツオ:1, は:1, サザエ:1, の:1, 弟:1,
サザエ:2, は:2, ワカメ:2, の:2, 姉:2,
ワカメ:3, は:3, カツオ:3, の:3, 妹:3

手順(3)

単語 ID
1,2,3
1,2,3
カツオ 1,3
サザエ 1,2
ワカメ 2,3
2
1
3

P15 転置インデックスの検索例1

検索質問 q=サザエ

単語 ID
サザエ 1,2

文書1と2を返す

P16 転置インデックスの検索例2

検索質問 q=ワカメ AND 姉

単語 ID
ワカメ 2,3
2

文書2を返す

P17 RDBと検索エンジンの違い

リレーショナルデータベース 検索エンジン
特徴 関係モデル トランザクション管理 CRUD 高速な全文検索
テーブル 複数 正規化 単一 非正規化
検索 SELECT 関係論理演算 キーワード検索 (AND/OR/NOT、表記揺れ、類義語、・・・)
検索結果 集合 ソート 関連度(クエリと文書の類似度)順

P18 転置インデックスの検索例3

検索質問 q=ワカメ OR 妹

単語 ID
ワカメ 2,3
3

文書3,2の順で返す

P19 スコア計算

スコア=クエリと文書の関連度
e.g. score( q, d ) = cos( q, d )

値は単語の重要度(ここでは個数)
tf*idf などが使われることが多い。

P20 日本語の単語分割方法

  • 形態素解析

    • 辞書に基づいた単語分割。
    • 検索結果は、検索誤りが低く、検索漏れが発生しがち。
    • 緊急事態宣言 → 緊急 / 事態 / 宣言
  • 文字N-gram

    • 機械的にN文字単位に分割。
    • 検索結果は、検索漏れが低く、検索誤りが発生しがち。
    • 緊急事態宣言 → 緊急 / 急事 / 事態 / 態宣 / 宣言 (N=2の場合)

P21 あいまいな単語境界

(例1)ここではきものを脱ぐ

ここ / では / きもの / を / 脱ぐ
ここ / で / はきもの / を / 脱ぐ

(例2)人間違い

人 / 間違い
人間 / 違い

P22 形態素解析の検索漏れの例

検索質問 q=きもの

単語 ID
ここ 1, …
1, …
はきもの 1, …
1, …
脱ぐ 1, …

ヒットなし

P23 検索漏れがおきにくい文字N-gram

検索質問① q=きもの → PhraseQuery("きも もの")
検索質問② q=はきもの → PhraseQuery("はき きも もの")

単語 ID
きも 1, …
はき 1, …
もの 1, …

どちらもヒットあり

P24 文字N-gramとて万全ではない

検索質問 q=妹

単語 ID
の姉 2
の弟 1
の妹 3
カツ 1
ツオ 1

ヒットなし

P25 検索エンジンの構成要素

クエリ

検索機能
単語分割機能
転置インデックス
インデクシング機能

検索結果

検索対象データソース

・インターネット
・データベース
・書誌データ
・企業内データ

P26 Apache Solr とその他の検索エンジン

  • Elasticsearch との比較

    • Apache Luceneを利用。⇒ 機能比較をしても意味がない。
    • 株式会社が運営。
    • 厳密な意味でオープンソースライセンスではない。
    • CodeZine の関口の記事をご覧ください。 https://codezine.jp/article/detail/10991
  • その他の商用検索エンジン

    • ユーザー数が少ない。⇒ 製品が成熟しない。
    • オープンでない、カスタマイズがしにくい。

P27 Apache Solr の基本機能

P28 Apache Solr の基本機能

  • Apache Solr 管理画面(Solr Admin UI)
  • コレクション(またはコア)
  • Apache Solr の設定ファイル
    • managed-schema
    • solrconfig.xml
  • インデクシング
    • 追加、更新、削除
    • コミット
  • 検索
    • 検索の基本パラメーター
    • ハイライト
    • ファセット

P29 [演習3] Apache Solr の管理画面にアクセス

インスタンスが起動したら Apache Solr の管理画面にアクセスしてみましょう。

  1. インスタンスの「オーバービュー」にて Solr Admin URL をクリックしてコピーします。
  2. コピーしたURLをWebブラウザーにペーストして Apache Solr の管理画面にアクセスしてみましょう。
    • アクセスできない場合、インスタンス作成時に指定した「IPアドレス範囲」が誤っている可能性があります。メニューの「設定」から新たな「IPアドレス範囲」を設定するか、「0.0.0.0/0」(全て許可)を設定します。(設定完了まで1〜2分お待ちください)
  3. Apache Solr の管理画面左下には「No cores available」と表示されています。このままでは何もできないので、次の演習でコレクションを作成しましよう。

P30 コレクション(コア)

  • Apache Solr インスタンス内にコレクション(コア)を作成します。
  • コレクション1つにつき、1つの独立したインデックスが作成されます。

インデクシングリクエスト / 検索リクエスト
http://localhost:8983/solr/collection1
・/collection1
managed-schema
solrconfig.xml
・インデックス
http://localhost:8983/solr/collection2
・/collection1
managed-schema
solrconfig.xml
・インデックス

P31 [演習4] コレクションの作成

インスタンス内に好きなだけ(ただしその分、メモリやディスクを消費します)コレクションを作成できます。コレクション1つにつき、独立したインデックス1つが作成されます。1つ目のコレクションを作ってみましょう。

  1. インスタンスを選んで「コレクション」メニューに行きます。
  2. 「コレクションを追加する」をクリックします。
  3. 新規作成タブが選ばれている状態で適当なコレクション名を入力し、「保存」をクリックします。
    • ここではコレクション名をcollection1とします。日本語や記号等はここでは使えません。
  4. コレクションができたら Apache Solr 管理画面を表示し、リロードしてみます。
    • 「No cores available」だったところに、collection1が表示されるようになります。

P32 Apache Solr の設定ファイル

managed-schema: スキーマの設定

<uniqueKey>id</uniqueKey>
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="name" type="text_general" indexed="true" stored="true"/>
<field name="cat" type="string" indexed="true" stored="true" multiValued="true"/>
<field name="features" type="text_general" indexed="true" stored="true" multiValued="true"/>
<field name="price"  type="pfloat" indexed="true" stored="true"/>

solrconfig.xml: 検索を含む各種設定

<query>
  <filterCache size="512" initialSize="512" autowarmCount="0"/>
</query>

<requestHandler name="/select" class="solr.SearchHandler">
  <lst name="defaults">
    <str name="echoParams">explicit</str>
    <int name="rows">10</int>
    <bool name="preferLocalShards">false</bool>
  </lst>
</requestHandler>

P33 [演習5] インデクシング

作成したコレクションに Solr 付属のサンプルデータを登録(インデクシング)します。サンプルデータは KandaSearch のライブラリーから入手します。

  1. 拡張機能ライブラリーをクリックします。一覧から「Apache Solr 付属サンプルデータ」を選択し、「プロジェクトに追加」します。
  2. プロジェクトの「拡張機能」に行き、プロジェクトに追加された「Apache Solr 付属サンプルデータ」をダウンロードします。
    • ローカルPCにRONDHUIT-exampledocs-1.0.0.xmlというファイル名で保存されます。
  3. インスタンスの「オーバービュー」に行き、「ドキュメントを登録する」をクリックします。ファイルのアップロードでアップロード先のコレクションが正しく選択されていることを確認し、先ほどダウンロードしたXMLファイルをアップロードしてインデクシングを行います。

P34 インデクシング文書

インデクシングする文書はXMLやJSONで以下のように表現します。1文書はフィールド名とその値のペアのセットです。

XML形式

<add>
 <doc>
  <field name="id">IW-02</field>
  <field name="name">iPod &amp; iPod Mini USB 2.0 Cable</field>
  <field name="manu">Belkin</field>
  <!-- Join -->
  <field name="manu_id_s">belkin</field>
  <field name="cat">electronics</field>
  <field name="cat">connector</field>
  <field name="features">car power adapter for iPod, white</field>
  <field name="weight">2.0</field>
  <field name="price">11.50</field>
  <field name="popularity">1</field>
  <field name="inStock">false</field>
  <!-- San Francisco store -->
  <field name="store">37.7752,-122.4232</field>
  <field name="manufacturedate_dt">2006-02-14T23:55:59Z</field>
 </doc>
</add>

JSON形式

[
  {
    "id" : "978-0641723445",
    "cat" : ["book","hardcover"],
    "name" : "The Lightning Thief",
    "author" : "Rick Riordan",
    "series_t" : "Percy Jackson and the Olympians",
    "sequence_i" : 1,
    "genre_s" : "fantasy",
    "inStock" : true,
    "price" : 12.50,
    "pages_i" : 384
  },
  {
    "id" : "978-1423103349",
    "cat" : ["book","paperback"],
    "name" : "The Sea of Monsters",
    "author" : "Rick Riordan",
    "series_t" : "Percy Jackson and the Olympians",
    "sequence_i" : 2,
    "genre_s" : "fantasy",
    "inStock" : true,
    "price" : 6.49,
    "pages_i" : 304
  }
]

P35 [演習6] 検索

Solr のサンプルデータが正しく登録されているか、検索して確認します。検索で使えるパラメーターや確認事項は多岐にわたりますので、講師の操作を参考にしながらいろいろ試してみてください。

  1. KandaSearch のインスタンスビューの「検索」メニュー
    • 左ペインのコレクションとユニークキー("id"と入力)を入力して「検索」をクリック。検索結果一覧が右ペインに表示されます。一覧のid値にマウスをホバーすると、storedデータが表示できます。左ペインのタイトルに"name"、ボディに"features"などと入力して再度「検索」します。また、検索語"ipod"と検索すると、ipodを含む文書のみ表示されます。「SOLR URLを表示する」をクリックすると、実際の Solr への HTTP GET リクエストを知ることができます。コピーしてブラウザから直接リクエストを投げてみましょう。
  2. Solr Admin UI
    • メニュー左下のコンボボックスからコレクションを選択してからQueryを選びます。qパラメーターにデフォルトの":"が設定されていることを確認し、「Execute Query」という青いボタンをクリックします。numFoundが32件となっていることを確認します。qパラメーターに"ipod"として「Execute Query」をします。結果はnumFoundが3件となり、3件ヒットすることが確認できます。

P36 Apache Solr の検索システム構成

Apache Solr は検索結果をXMLやJSON形式で返却します。そのため、一般的に下図のようなWebアプリケーション・サーバーを配置して、HTMLに変換します。

検索ユーザー

<検索リクエスト>

Webアプリケーションサーバー

<検索リクエスト>

Apache Solr・インデックス ↓
<検索結果レスポンス(XML/JSON)>

Webアプリケーションサーバー

<検索結果HTMLページ>

検索ユーザー

Apache Solr への検索リクエスト②(HTTP GETの場合)
http://localhost:8983/solr/collection1/select?q=検索キーワード&start=0&rows=10
・プロトコル
・Solrサーバーホスト名&ポート番号
・コンテキスト名
・コレクション名
・リクエストハンドラー名
リクエストパラメーター

P37 検索の基本的なパラメーター

検索は /select リクエストハンドラーに、HTTP GET(POSTも可)リクエストを投げることで行います。基本的なパラメーターを以下に示します。

パラメーター 説明
q 検索キーワードや検索式(次ページ)を指定。 q=人工知能
start 取得する検索結果の開始位置(デフォルトは0)を指定。 # 最初の10件を取得 start=0&rows=10 # 次の10件を取得 start=10&rows=10
rows 取得する検索結果件数(デフォルトは10)を指定。
df デフォルト検索フィールド名を指定。 df=features
fl 検索結果として返却するフィールドをカンマ区切りで指定。 fl=id,name,score
fq フィルタークエリを指定。 fq=cat:memory
q.op デフォルトオペレーターとしてOR(デフォルト)またはANDを指定。 q.op=AND
sort 昇順/降順でソートするフィールド(複数可)を指定。 sort=price asc, score desc

P38 検索式の例

クエリパーサーがluceneまたはedismaxのとき(defType=lucene または edismax)、以下のような検索式がqパラメーターに指定できます。

説明
q=人工知能 「人工知能」を検索します。フィールドが指定されていないのでdfで指定されたフィールドを検索します。dfが指定されていないとエラーになります。
q=name:人工知能 nameフィールドを「人工知能」で検索します。
q=name:人工知能 AND cat:game nameフィールドに「人工知能」かつcatフィールドに「game」を含む文書を検索します。
q=name:(AI OR 人工知能) NOT cat:game nameフィールドに「AI」または「人工知能」を含むがcatフィールドに「game」を含まない文書を検索します。
q=price:[0 TO 100] priceフィールドの値が0から100までの文書を検索します。
q=title:人工知能^10 body:人工知能 titleフィールドまたはbodyフィールドに「人工知能」を含む文書を検索します。titleフィールドに重み10(デフォルトは1)をかけ、bodyフィールドより重要度を上げています。
q="artificial intelligence" デフォルトフィールド(df)を"artifical intelligence"というフレーズで検索します。

P39 検索結果レスポンス(JSON形式)

{
  "responseHeader":{
    "status":0,
    "QTime":0,
    "params":{
      "q":"id:[0000000001 TO 0000000002]",
      "fl":"id,score,childcareCenterName,address1",
      "q.op":"OR",
      "rows":"10"}},
  "response":{"numFound":2,"start":0,"maxScore":1.0,"numFoundExact":true,"docs":[
      {
        "id":"0000000001",
        "childcareCenterName":"大森小学校子どもルーム",
        "address1":"千葉県千葉市中央区大森町268",
        "score":1.0},
      {
        "id":"0000000002",
        "childcareCenterName":"寒川小学校子どもルーム",
        "address1":"千葉県千葉市中央区寒川町1-205",
        "score":1.0}]
  }
}

P40 [演習7] 日本語検索用コレクションの作成

Solr 付属のサンプルデータは日本語を含まないので日本語の動作がよくわかりません。これ以降は日本語データを登録して日本語を検索できるか試してみます。

  1. 拡張機能ライブラリーをクリックします。一覧から「RONDHUIT EC configuration」を選択して「プロジェクトに追加」します。
  2. プロジェクトの拡張機能に行き、プロジェクトに追加したEC confをダウンロードします。
  3. インスタンスの「コレクション」に行き、「コレクションを追加する」をクリックします。ポップアップで「インポート」を選んでEC confをアップロードし、コレクションを作成します。(コレクション名はここではecとします)

P41 [演習8] ECデータの登録と検索

  1. 拡張機能ライブラリーをクリックします。一覧から「RONDHUIT EC data」を選択して「プロジェクトに追加」します。
  2. プロジェクトの拡張機能に行き、プロジェクトに追加したEC dataをダウンロードします。
  3. インスタンスの「オーバービュー」に行き、「ドキュメントを登録する」からEC dataを登録します。
  4. インスタンスの「検索」で以下の検索を試します。
    • コレクションでec、ユニークキーでidと入力し検索。
    • タイトルにproductName、ボディにproductInfoと入力して検索。
    • 「のり」を検索。⇒ "no field name specified in query and no default specified via 'df' param"というエラーになるのでデフォルトフィールド(df)にproductNameやproductInfoを設定して、再度「のり」を検索します。
      • UIでハイライト設定をしていませんが、solrconfig.xmlにデフォルトでハイライト設定がしてあるので、ハイライトがある程度行われています。

P42 ハイライト機能とは?

  • 検索キーワードにヒットした文書における、当該検索キーワードを中に含む前後の部分文字列(これをスニペットと呼びます)を切り出して、検索結果と共に返却する機能です。
    • 検索時にhl=onパラメーターを付加してハイライト機能をONにします。
  • スニペット中の検索キーワードはHTMLタグなどで強調表示されます。
  • 検索結果一覧としてハイライトスニペットを表示することで、検索ユーザーが求める文書を選びやすくなります。
  • Solrのハイライト機能は、Solrのクライアント側でハイライトを行うよりも、以下の点で優位性があります。
    • 類義語等、表記揺れを考慮したハイライトが行えます。
    • スニペットを切り出すロジックを書く必要がありません。
    • ネットワーク負荷が低減できます(特に1文書のサイズが大きい場合)。

P43 ハイライトを含む検索結果レスポンス(JSON形式)

{ "responseHeader":{
    "status":0,
    "QTime":4,
    "params":{
      "q":"放課後",
      "hl":"true",
      "fl":"id,score,childcareCenterName,address1",
      "hl.fl":"childcareCenterName",
      "rows": 2,
      "facet":"off"}},
  "response":{"numFound":235,"start":0,"maxScore":61.1878,"numFoundExact":true,"docs":[
      { "id":"0000000179",
        "childcareCenterName":"船橋放課後ルーム",
        "address1":"千葉県船橋市本町4-17-20",
        "score":61.1878},
      { "id":"0000000180",
        "childcareCenterName":"湊町放課後ルーム",
        "address1":"千葉県船橋市湊町1-16-5",
        "score":61.1878}]
  },
  "highlighting":{
    "0000000179":{"childcareCenterName":["船橋<b>放課後</b>ルーム"]},
    "0000000180":{"childcareCenterName":["湊町<b>放課後</b>ルーム"]}}}

P44 [演習問題] フィールドの横断検索

productNameとproductInfoの両フィールドを一度に検索するにはどうしたらいいでしょうか。次の2通りの場合で考えてみてください。

  1. クエリパーサー defType=lucene のとき
    • ヒント:検索窓に以下のLuceneのクエリ式を入力して検索します。
      フィールド名1:検索キーワード OR フィールド名2:検索キーワード OR フィールド名3:検索キーワード …
  2. クエリパーサー defType=edismax(※) のとき
    • ヒント:クエリフィールド qf パラメーターに横断検索したいフィールド名を列挙します。フィールド名とフィールド名の間は半角スペースで区切ります(カンマ区切りはNG)。
    • ヒント:solrconfig.xmlにqfパラメーターがデフォルト値として設定されています。インスタンスの「コンフィグ」から確認してみましょう。

※ edismaxは、デファクトスタンダードなクエリパーサーです。luceneクエリパーサーのほぼ全ての機能を包含しつつ、フィールドの横断検索等が簡単にできるようになっています。edismax について詳しくは「第4回 全文検索のさまざまなテクニック」で説明します。

P45 [演習9] ファセットと絞り込み検索

千葉県のオープンデータ「子育て施設一覧」(KandaSearch のライブラリーから取得できます)を使ってファセットと絞り込み検索をやってみます。これまでの操作と同様に、コレクション(childcareとします)を作成し、データをインデクシングします(ダウンロードしたZIPファイルを解凍する必要があります)。インスタンスの「検索」から以下を試します。

  1. コレクションでchildcare、ユニークキーでid、タイトルにchildcareCenterName、ボディにaddress1と入力して検索。
  2. 右ペインの検索結果に表示されるチェックボックスをクリックしていき、徐々に検索結果が絞り込まれることを確認します。
    • (例)TargetAge:小学校1年生 > CityName:四街道市 > SatFlg:1

P46 ファセットと絞り込み検索機能とは?(1/2)

以下の2つの社内検索システム、どちらが使いやすいでしょうか。

A. あらかじめファイル種別や作成日を選ばなければ検索できないシステム
B. とりあえず検索でき、検索結果を見ながらファイル種別や作成日を選んで検索結果を絞り込めるシステム

P47 ファセットと絞り込み検索機能とは?(2/2)

  • ファセットは、検索結果の「内訳」をその件数とともに返却する機能です。
    • facet=on パラメーターを指定してファセット機能を有効にします。
  • 通常は、ファセットと絞り込み検索機能を組み合わせて使うことで、検索UIに次のような効果をもたらします。
    • 検索するのに属性(前ページの「ファイル種別」や「作成日」等)を全て決定する必要がない。
    • 検索結果を得るまでの操作が簡単。
    • 「ヒット:0件」となるガッカリ感がない。
  • ファセットには以下の2種類があります。
    • facet.field…フィールド名を指定します。フィールド値ごとの文書件数が返却されます。
    • facet.query…任意のクエリ(検索式)を指定します。当該クエリごとの文書件数が返却されます。
  • 絞り込み検索は fq パラメーターにクエリを指定します。
    • ANDで q パラメーターに条件を付加するのは誤りです(アンチパターン)。

P48 ファセットのレスポンスと絞り込み検索の実行例

「議事録」で検索!

q=議事録&facet=on
&facet.query=date:[* TO 2020-12-31T23:59:59Z]
&facet.query=date:[2021-01-01T00:00:00Z TO 2021-12-31T23:59:59Z]
&facet.query=date:[2022-01-01T00:00:00Z TO *]
&facet.field=filetype

最初のレスポンス

"facet_queries":{
  "date:[* TO 2020-12-31T23:59:59Z]":85,
  "date:[2021-01-01T00:00:00Z TO 2021-12-31T23:59:59Z]":60,
  "date:[2022-01-01T00:00:00Z TO *]":48},
"facet_fields":{
  "filetype":[
    "PDF",100,
    "Word",50,
    "Excel",43]}

絞り込んで検索!

q=議事録&fq=filetype:Word&facet=on
&facet.query=date:[* TO 2020-12-31T23:59:59Z]
&facet.query=date:[2021-01-01T00:00:00Z TO 2021-12-31T23:59:59Z]
&facet.query=date:[2022-01-01T00:00:00Z TO *]

絞り込み後のレスポンス

"facet_queries":{
  "date:[* TO 2020-12-31T23:59:59Z]":0,
  "date:[2021-01-01T00:00:00Z TO 2021-12-31T23:59:59Z]":20,
  "date:[2022-01-01T00:00:00Z TO *]":30},
"facet_fields":{
  "filetype":[]}

P49 [演習10] Webアプリのダウンロード(Advanced)

前の演習で作成した「EC」または「子育て支援施設」のコレクションを使って検索メニューで検索できることを確認した状態で、同じ検索メニューの中で「WEBアプリダウンロード(JAVA)」をクリックします(タイミングによってダウンロードに時間がかかることがあります)。ダウンロードしたZIPファイルを展開し、README.mdにしたがって以下のように起動すると、Webアプリケーションが起動しますので、http://localhost:9090/ にアクセスしてWeb画面から検索をすぐさま実行できます。ZIPファイルにはソースコードとGradleのビルド環境も全て含まれていますので、Webアプリケーションの開発の参考にすることができます。なお、実行とビルドにはJava 1.8以上が必要です。

java -jar ks-search-client-1.0.2.war

P50 Q&A, アンケート

P51 (Appendix)Apache Solr のコマンドなど

P52 Solrの起動/停止、コレクションの作成

スタンドアロンの Solr を起動/停止するには、Apache Solr に付属の solr コマンドを使って次のように行います。

solr start
solr stop

スタンドアロンの Solr にコレクション(コア)を作成するには、Apache Solr に付属の solr コマンドを使って次のように行います。

solr create_core -c collection1 -d sample_techproducts_configs

P53 インデクシング

インデクシングは Apache Solr に付属の post コマンドを使って次のように行います。

post -c collection1 -commit yes example/exampledocs/*.xml

P54 文書の更新/削除、コミット

文書の更新は、ユニークキーが同じものを再追加することで行います。

文書の削除は、<delete>〜</delete>というXMLをPOSTして実行します。

削除する文書のユニークキー値をに指定して削除

<delete>
  <id>978-0641723445</id>
  <id>978-1423103349</id>
</delete>

削除する文書クエリで指定して削除

<delete>
  <query>name:ipod</query>
  <query>cat:book price:[0 TO 100]</query>
</delete>

インデクシングを確定するためにコミットを行います。コミットはというXMLをPOSTするか、commit=trueというパラメーターを付与するか、solrconfig.xmlに以下のような設定をして行います。

<autoCommit>
  <maxDocs>10000</maxDocs>
  <maxTime>30000</maxTime>
</autoCommit>

P55 ハイライトの基本パラメーター

パラメーター名 説明 デフォルト
hl hl=onとしてハイライトを使うことを宣言します。 hl=off
hl.method original, unified, fastVectorの中からハイライト方式を指定します。 hl.method=original
hl.fl ハイライト対象フィールドをカンマ区切りで指定します。ハイライトするには、stored=trueでなければいけません。 なし
hl.snippets 返却して欲しいハイライトスニペット最大数を指定します。 hl.snippets=1
hl.fragsize 各スニペットのおよその文字数を指定します。 hl.fragsize=100
hl.requireFieldMatch trueのとき、検索時に指定されたフィールドのみハイライトします。 hl.requireFieldMatch=false
hl.usePhraseHighlighter trueのとき、フレーズ単位でハイライトを行います。 hl.usePhraseHighlighter=true
hl.highlightMultiTerm ワイルドカード検索やあいまい検索でもハイライトを行うかどうかを指定します。 hl.highlightMultiTerm=true

お見積もり・詳細は KandaSearch チームに
お気軽にお問い合わせください。

お問い合わせ