Software Design plus
[改訂第3版]Apache Solr入門
―オープンソース全文検索エンジン
-
打田智子,大須賀稔,大杉直也,西潟一生,西本順平,平賀一昭 著
株式会社ロンウイット,株式会社リクルートテクノロジーズ 監修 - 定価
- 4,180円(本体3,800円+税10%)
- 発売日
- 2017.4.27 2017.4.22
- 判型
- B5変形
- 頁数
- 392ページ
- ISBN
- 978-4-7741-8930-7 978-4-7741-8976-5
概要
今回で3回目の改訂となるApache Solrの解説書です。Solrはオープンソースの検索エンジンソフトウェアです。多くの企業で使用され,検索を利用したさまざまなサービスを実現する基盤になっています。本書はSolrの基本的な技術の解説と知識をまとめたのちに,ドキュメント検索,インデクシング,クラスタなどのその特徴あるしくみを紹介し,より具体的なプログラミング手法にも言及していきます。そして検索精度改善,レコメンデーションシステムへの応用といった発展的な利用方法まで詳細に解説します。
補足
本書は,ハンズオン形式で動作を確認しながら読み進められるよう,豊富なサンプルコードと設定例を用意しています。書籍内で紹介するサンプルは,次のGitHub リポジトリから入手できます。どうぞ,お手元にリポジトリをclone してから本書を読み進めてください!
こんな方にオススメ
- 検索エンジンのしくみ,自然言語解析,レコメンデーション,分散システム(の基礎),などコンピュータサイエンスとエンジニアリングの狭間に興味がある先進の気風をもった若きエンジニアの皆さん
目次
第1章 イントロダクション
- 1.1 Apache Solrとは
- 1.1.1 Solr の特徴
- 1.2 検索エンジンのしくみ
- 1.2.1 転置インデックス
- 1.2.2 検索結果のランキング
- 1.3 単語分割とアナライザ
- 1.3.1 単語分割(トークナイズ)
- 1.3.2 アナライザ
- 1.4 Solrのインストール
- 1.4.1 Javaのインストール
- 1.4.2 Solrのインストール(全プラットフォーム共通)
- 1.5 Solr付属のサンプルを実行する
- 1.5.1 Solrの起動とサンプルデータの登録
- 1.5.2 サンプルデータの検索
- 1.5.3 Solritasの使い方
- 1.5.4 Solrの停止
- 1.6 Solrのアーキテクチャ
- 1.6.1 Solr全体構成
- 1.6.2 Solrホームディレクトリ
第2章 スキーマの定義
- 2.1 スキーマとは
- 2.2 スキーマ定義ファイル
- 2.2.1 コアの作成
- 2.2.2 managed-schemaとschema.xml
- 2.2.3 スキーマ定義ファイルの配置場所
- 2.3 スキーマ定義の流れ
- 2.3.1 スキーマ定義の有効化
- 2.4 フィールドタイプ
- 2.4.1 フィールドタイプの定義
- 2.4.2 非テキスト系フィールドタイプ
- 2.4.3 テキスト系フィールドタイプ
- 2.4.4 アナライザ
- 2.5 フィールドの定義
- 2.6 Analysis画面
- 2.6.1 text_jaの動作確認
- 2.7 書籍データでの定義例
- 2.7.1 書籍データのフィールドについて
第3章 インデックスの作成
- 3.1 ドキュメントの登録
- 3.1.1 Solrの起動
- 3.1.2 コアの作成
- 3.1.3 スキーマの定義
- 3.1.4 JSONファイルによる登録
- 3.1.5 XMLファイルによる登録
- 3.1.6 CSVファイルによる登録
- 3.2 「書籍データ」のインデクシング
- 3.2.1 sample-books.jsonの登録
- 3.2.2 ドキュメントの登録確認
- 3.3 インデックスディレクトリ
- 3.4 ドキュメントの更新
- 3.4.1 アトミックアップデート(部分更新)
- 3.5 ドキュメントの削除
- 3.6 コミット/ロールバック
- 3.6.1 コミット
- 3.6.2 自動コミット
- 3.6.3 commitWithin
- 3.6.4 ロールバック
第4章 ドキュメントの検索
- 4.1 検索の基本動作
- 4.1.1 検索のしくみ
- 4.1.2 検索リクエストとパラメータ
- 4.1.3 検索式
- 4.1.4 サーチハンドラ
- 4.1.5 レスポンスライタ
- 4.2 検索レスポンス
- 4.2.1 ヘッダ情報
- 4.2.2 検索結果
- 4.3 検索結果のソート
- 4.3.1 スコアでのソート
- 4.3.2 特定フィールドでのソート
- 4.4 ハイライト
- 4.4.1 ハイライトの基本動作
- 4.4.2 ハイライトの設定
- 4.4.3 ハイライトの結果
- 4.5 絞り込み検索(フィルタクエリ:fq)
- 4.6 ファセット
- 4.6.1 ファセットとは
- 4.6.2 ファセットのしくみ
第5章 高度なインデクシング
- 5.1 バッチ処理
- 5.1.1 JSON データによるバッチ処理例
- 5.1.2 XML データによるバッチ処理例
- 5.2 インデクシング前処理――UpdateRequestProcessor
- 5.2.1 UpdateRequestProcessorの設定
- 5.2.2 正規表現による置換――RegexReplaceProcessorFactory
- 5.2.3 スクリプト処理――StatelessScriptUpdateProcessorFactory
- 5.2.4 その他のUpdateRequestProcessor
- 5.3 データのインポート――DataImportHandle
- 5.3.1 データインポートハンドラの設定
- 5.3.2 RDB からのインポート
- 5.4 擬似リアルタイム検索
- 5.4.1 (ハード)コミットとソフトコミット
- 5.4.2 自動ソフトコミット
- 5.5 バイナリ形式ドキュメントのインデクシング――ExtractingRequestHandler
- 5.5.1 ExtractingRequestHandler の設定
- 5.5.2 ExtractingRequestHandler を使ったインデクシング
- 5.6 インデックス作成に関連するsolrconfig.xmlの設定
- 5.6.1 IndexConfig設定
- 5.6.2 インデックスセグメントとマージポリシー
- 5.6.3 オプティマイズ
- 5.7 トランザクションログ
- 5.7.1 トランザクションログとインデックスの更新のしくみ
- 5.7.2 トランザクションログの設定
- 5.7.3 リアルタイムGet
- 5.7.4 インデックスのリカバリ
第6章 高度な検索
- 6.1 クエリパーサ
- 6.1.1 Standard クエリパーサ
- 6.1.2 DisMax クエリパーサ
- 6.1.3 Extended DisMaxクエリパーサ
- 6.1.4 ローカルパラメータ
- 6.2 ハイライト
- 6.2.1 ハイライタの種類
- 6.2.2 ハイライタの設定
- 6.2.3 ハイライト用の検索パラメータ
- 6.3 ファセット
- 6.3.1 フィールド値によるファセット
- 6.3.2 クエリによるファセット
- 6.3.3 レンジファセット(範囲によるファセット)
- 6.3.4 ピボットファセット
- 6.4 サーチコンポーネントとサーチハンドラ
- 6.4.1 検索キーワードのサジェスチョン――SuggestComponent
- 6.4.2 統計情報の表示――StatsComponent
- 6.5 Result GroupingとCollapse and Expand
- 6.5.1 Result Groupingとは
- 6.5.2 Collapse and Expand とは
- 6.6 空間検索
- 6.6.1 空間検索とは
- 6.6.2 フィールド定義とインデックス
- 6.6.3 空間検索の利用例
- 6.7 ファンクションクエリ
- 6.7.1 ファンクションクエリとは
- 6.7.2 Solrに標準のファンクション
- 6.8 キャッシュ
- 6.8.1 キャッシュの種類と設定
- 6.8.2 キャッシュの自動ウォームアップ
- 6.8.3 キャッシュの統計情報
第7章 スキーマ設計
- 7.1 スキーマ定義ファイル
- 7.1.1 スキーマ定義ファイルの配置場所と設定
- 7.1.2 スキーマ定義の構成要素
- 7.1.3 スキーマレスモード
- 7.2 フィールドタイプ
- 7.2.1 フィールドタイプの設定オプション
- 7.2.2 非テキスト系フィールドタイプ
- 7.2.3 テキスト系フィールドタイプ
- 7.2.4 アナライザ
- 7.2.5 文字フィルタ
- 7.2.6 代表的なトークナイザ
- 7.2.7 代表的なトークンフィルタ
- 7.3 フィールドの定義
- 7.3.1 フィールドの定義
- 7.3.2 ダイナミックフィールドの定義
- 7.3.3 ユニークキーフィールドの定義
- 7.3.4 コピーフィールドの定義
- 7.3.5 その他のフィールドとオプションの説明
- 7.4 Similarityの定義
第8章 クラスタ構築と運用
- 8.1 単一ノードの限界
- 8.2 分散インデックスと分散検索
- 8.2.1 分散インデックス
- 8.2.2 分散検索
- 8.2.3 分散インデックスのセットアップ
- 8.2.4 分散インデクシングと分散検索の実行
- 8.2.5 分散検索のエラー回避
- 8.3 レプリケーション
- 8.3.1 レプリケーションの概要
- 8.3.2 マスタ/スレーブの設定方法と設定項目
- 8.3.3 マスタ/スレーブのセットアップ
- 8.3.4 レプリケーションの確認
- 8.4 レガシーなクラスタ
- 8.4.1 レガシーなクラスタを構築する準備
- 8.4.2 レガシーなクラスタの構築
- 8.4.3 分散インデクシングと分散検索
- 8.5 SolrCloud
- 8.5.1 ZooKeeperのインストールと起動
- 8.5.2 SolrCloud構築
- 8.5.3 分散インデクシングと分散検索,レプリケーション
- 8.5.4 フェールオーバー
- 8.5.5 インデックスのリカバリ
- 8.5.6 リーダーの選出
- 8.5.7 SolrCloudの拡張
第9章 検索精度の改善
- 9.1 検索精度の定義
- 9.1.1 再現率と適合率
- 9.1.2 ランキング
- 9.2 再現率と適合率の改善
- 9.2.1 アナライザの変更による再現率と適合率の改善
- 9.2.2 各種辞書の活用
- 9.3 ランキングの改善
- 9.3.1 キーワードと文書の類似度
- 9.3.2 ファンクションクエリの活用
- 9.3.3 クエリリランキング
- 9.4 検索精度の評価
- 9.4.1 オフライン評価
- 9.4.2 オンライン評価とオフライン評価
- 9.4.3 A/Bテスト
- 9.5 機械学習による検索の改善
- 9.5.1 Learning To Rank
- 9.6 Solrをレコメンドエンジンとして使う
- 9.6.1 レコメンドは検索の特殊ケース
- 9.6.2 レコメンドエンジンの作り方の例
- 9.6.3 ログからレコメンドの中身を考える
- 9.6.4 クエリに任せる処理,インデックス時に行う処理
- 9.6.5 IDと属性の比較
第10章 開発運用のTIPS
- 10.1 サイジング
- 10.1.1 CPU
- 10.1.2 メモリ
- 10.1.3 ストレージ
- 10.2 モニタリング
- 10.2.1 管理画面からの確認
- 10.2.2 REST APIからの確認
- 10.2.3 JMXからの確認
- 10.3 Solr4系からのバージョンアップ
- 10.3.1 Javaのバージョンの変更
- 10.3.2 warデプロイの廃止および起動方法の変更
- 10.3.3 solr.xmlフォーマットの変更
- 10.3.4 デフォルトのSchemaFactoryの変更
- 10.3.5 デフォルトのSimilarityの変更
- 10.3.6 StopFilterFactoryのenablePositionIncrements属性の廃止
- 10.3.7 SolrJ APIの変更
- 10.3.8 DocValuesの使用
- 10.4 ログの設定
- 10.4.1 Solrログ
- 10.4.2 GCログ
- 10.5 Distributed IDF
- 10.6 FAQ集
- 10.6.1 Question 1 -ソートがうまくいかない
- 10.6.2 Question 2 -シノニム辞書を定義したのに思うように動作しない
- 10.6.3 Question 3 -定義できるフィールド数に制限はあるのか?
- 10.6.4 Question 4 -ワイルドカード検索がうまくいかない
- 10.6.5 Question 5 -Solrの起動が極端に遅い
- 10.6.6 Question 6 -実際にレコメンド目的でSolrを導入している例とは?
第11章 SolrJ プログラミング
- 11.1 SolrJクライアントアプリケーション
- 11.1.1 ビルドとインストール
- 11.1.2 ドキュメントの登録
- 11.1.3 ドキュメントの検索
- 11.1.4 ドキュメントの削除
- 11.1.5 インテグレーションテスト(結合テスト)
Appendix 付録
Appendix 1 Gitのインストール
- A.1.1 Ubuntu などのDebian 系Linux
- A.1.2 CentOS などRedHat 系Linux
- A.1.3 Mac/Windows
Appendix 2 Python機械学習の環境構築
- A.2.1 必要なもの
- A.2.2 インストール
- A.2.3 関連パッケージの準備
- A.2.4 Jupyter Notebook の起動
Appendix 3 ネステッドドキュメントとBlock Join
- A.3.1 ユースケース
- A.3.2 インデクシング
- A.3.3 Block Join
- A.3.4 ネステッドドキュメントにおけるファセット
Appendix 4 N-best
- A.4.1 形態素解析のしくみ
- A.4.2 N-best によって改善できるこ
- A.4.3 N-best の仕様
- A.4.4 N-bestのパラメータ
- A.4.5 Analysis画面での確認
プロフィール
打田智子
第 1 章,第 5章の 5.1~5.6,第 6 章の6.1,6.3,6.4,6.8,第 9章の9.1,9.4.1,第 10章,付録A.1を担当。
ソフトウェアパッケージベンダー,Web サービス企業,(株)ロンウイットを経て,2016 年12 月より(株)ニューズピックスに勤務。ソフトウェアエンジニアとして,ソーシャル経済ニュースサービスの開発・運用に携わる。Luke: Lucen Toolbox Project 共同コミッター。Pure Python 形態素解析器Janome 開発者。活字と本とニュースメディアが好き。また,本書の執筆をリード。
大須賀稔
第 5 章の 5.7,第 8章,第 11 章を担当。
Web サービス企業,外資系検索エンジン企業,楽天(株),(株)ロンウイットを経て,2014 年にヤフー(株)へ入社。検索プラットフォーム開発チームリーダーを務めたのち,2015 年からヤフー(株)100%子会社でR & D を目的としたゼットラボ(株)( https://zlab.co.jp)の立ち上げに参画,出向。現在はDocker やKubernetes などを使用した次世代情報基盤の研究開発に従事。
Apache ManifoldCF コミッター兼PMC メンバーApache Solr,Banana コントリビューター
大杉直也
第 9 章の 9.3.1,9.4.2,9.4.3,9.5,9.6,付録A.2を担当。
データサイエンティスト。理化学研究所脳科学総合研究センター博士課程学生RA から2014 年に(株)リクルートテクノロジーズに入社。2016 年度時点は開発部署での分析屋さんとして,リクルートグループ内のさまざまなサービスで検索を改善している。決め台詞は「サルの脳波より簡単」。ボードゲーム好きで子どもと遊ぶボランティア団体を2012 年より立ち上げ。小平ボードゲーム交流会代表。
西潟一生
第 2 章,第 3 章,第 4 章を担当。
情報系大学院修士課程修了。全文検索エンジンの開発,販売を主力ビジネスとするベンダーを経て,2015 年に(株)ロンウイットに入社。Apache Lucene/Solr の導入支援コンサルティング,運用サポート,トレーニング,自社製品およびOSS 開発に従事。
西本順平
第 7 章,付録 A.4 を担当。
デジタル・インフォメーション・テクノロジー(株)に勤務。組み込み系システム開発業務を経て,2010 年よりSolr を利用した検索エンジン基盤の開発・導入推進に携わる。現在リクルートテクノロジーズにてSolr およびElasticsearch の導入や検索改善に従事。リクルートグループのさまざまなWeb サービスを支援している。
平賀一昭
第 6 章の 6.2,6.5~6.7,第 9 章の 9.2,9.3.2,9.3.3,付録A.3を担当。
通信系SI 企業からインフォシーク(買収により楽天),ファストサーチ&トランスファ(買収によりマイクロソフト),ベイシス・テクノロジーを経て,2012 年より楽天(株)にて次世代検索プラットフォームの開発,検索精度の改善に携わっている。lucene-gosen コミッター
株式会社ロンウイット
監修
http://www.rondhuit.com/
Apache Lucene/Solr のコミッターでもある関口宏司が2006 年に情報検索の専門企業として設立。Apache Solr やApache ManifoldCF,Elasticsearch などに関する技術コンサルティングをはじめ,それらのトレーニング,サポートサービスの提供およびサブスクリプション・パッケージの開発/販売を行う。業務で得た知見を元にオープンソースに貢献し,日本人では数少ないApache コミッターを複数名輩出。近年はよりよい検索体験を提供するため自然言語処理/機械学習にも注力している。
株式会社リクルートテクノロジーズ
監修
http://recruit-tech.co.jp
2012 年10 月リクルート分社化により,リクルートグループのIT・ネットマーケティングテクノロジー開発機能会社として設立。これまでも社内ツールのオープンソース公開や各種講演,Hadoop カンファレンスや勉強会の主催などを通してOSS に貢献。「業界を驚かせるレベルでテクノロジーの開拓を行い,業界ルールをイノベーションにより変革する」を掲げる。