高速スケーラブル検索エンジン ElasticSearch Server
3,080円 (2,800円+税)
関連サイト
本書の関連ページが用意されています。
内容紹介
本書は、ElasticSearchの一般的な紹介から始めて、ElasticSearchサーバをどのように実行するか、設定ファイルやREST APIによる設定方法までをカバーしています。また、インデックスをどのように構築し、それをElasticSearchにどのように伝えるのか、フィールドごとに異なるアナライズをどのように設定し、組み込まれているデータタイプをどのように使うかも学習します。
本書は複雑なクエリや結果のフィルタリングを行うことができるクエリDSL(Query DSL)についても言及します。また、クエリの検索結果に基づいて集約されたデータから計算されるファセットの利用方法についても学びます。オートコンプリートの実現方法や、ElasticSearchの空間検索の利用方法や予測検索の利用方法も学ぶでしょう。
最後に、本書はElasticSearchの管理API(shard配置管理、クラスタ運用など)の能力についても示します。さらに、ElasticSearchサーバを利用している時に発生する一般的な問題をどのように乗り越えるかも学びます。
(「序文」より)
書誌情報
- 著者: Rafal Kuc, Marek Rogozinski, 大岩達也(翻訳), 大谷純(翻訳), 兼山元太(翻訳), 水戸祐介(翻訳), 守谷純之介(翻訳), 株式会社リクルートテクノロジーズ(監修)
- 発行日: 2014-03-25 (紙書籍版発行日: 2014-03-25)
- 最終更新日: 2014-03-25
- バージョン: 1.0.0
- ページ数: 336ページ(PDF版換算)
- 対応フォーマット: PDF, EPUB
- 出版社: KADOKAWA/アスキー・メディアワークス
対象読者
検索ツールに興味のある方、検索エンジンを使いたい方
著者について
Rafal Kuc
Rafał Kućはチームリーダーであり開発者です。彼はSematext Group, Inc.に所属し、コンサルタントやソフトウェアエンジニアとして働いています。また、彼はApache LuceneやSolr、ElasticSearchやHadoopスタックのようなOSSテクノロジーに注力しています。彼は、11年以上、さまざまなソフトウェア(銀行ソフトウェアからe-コマースプロダクトまで)についての経験を持っています。彼は、おもにJavaに注力していますが、簡単にすばやく目的を達成させるためならば、どのようなプログラミング言語やツールでも受け入れています。彼はまたsolr.plサイトの創始者の一人で、SolrやLuceneについてのさまざまな知識を提供し、いろいろな人の問題についての助けとなっています。彼はまた、世界中のさまざまなカンファレンス(Lucene Eurocon、Berlin BuzzwordsやApacheCon)のスピーカーでもあります。Rafałは2002年にLuceneに関わりましたが、最初は好きになれませんでした。2003年にLuceneに再度携わった時、検索技術のポテンシャルを見て、フレームワークについての考えを変えました。そしてSolrが現れ、Solrは「これだ!」というものでした。彼は、ElasticSearchについて2010年中盤から関わっています。現在はLucene、Solr、ElasticSearchや情報検索が彼の主な興味のある対象です。RafałはまたApache Solr 3.1 Cookbookの著者でもあり、その改訂版であるApache Solr 4 CookbookもPackt Publishingから出版されています。
Marek Rogozinski
Marek Rogozińskiは10年以上の経験を持つソフトウェアアーキテクトであり、コンサルタントです。彼の専門はSolrやElasticSearchのようなオープンソースを用いたソリューションです。Marekはまたsolr.plサイトの出資者の一人で、SolrやLuceneライブラリについての情報やチュートリアルを公開しています。彼は現在、DiscourseソーシャルコラボレーションソフトウェアベンダのSmartupz社の最高技術責任者です。
大岩達也
2010 年に楽天株式会社に入社。楽天市場をはじめとするさまざまなサービスの検索システムの開発に携わる。
大谷純
1975 年広島県出身。広島市立大学情報科学研究科修了。(株)シーマークに勤務。Elasticsearch 勉強会を主催。最近では検索システム構築支援などを主に担当。好きなことばは「臨機応変」。現在、リクルートテクノロジーズ・アドバンストテクノロジーラボ(ATL)をコミュニティリードとして支援中。ブログ:http://blog.johtani.info
兼山元太
1986 年岐阜県出身。静岡大学情報学部情報科学研究科卒業。クックパッド株式会社に勤務。レシピ検索システムの開発に従事。Elasticsearch の使いやすさに感銘を受け、翻訳に参加。夢は世界中で使われる道具を作ること。
水戸祐介
1984 年北海道札幌市出身。北海道大学大学院情報科学研究科修了。クックパッド株式会社に勤務。Ruby on Rails を使ったWeb サービスやRESTful API の開発を経験。最近、iOS エンジニアに転身し四苦八苦中。業務でKibana を使用していたことから縁あって本書にKibana の紹介文を寄稿。
守谷純之介
1972 年東京都出身。東京学芸大学卒業。電気通信大学大学院電気通信学研究科修了。博士(工学)。株式会社リクルートテクノロジーズ・アドバンストテクノロジーラボ(ATL)に勤務。オープンソースの開発と情報検索全般に興味がある。
株式会社リクルートテクノロジーズ
http://recruit-tech.co.jp
2012 年10 月リクルート分社化により、リクルートグループのIT・ネットマーケティングテクノロジー開発機能会社として設立。これまでも社内ツールのオープンソース公開や各種講演、Hadoop カンファレンスや勉強会の主催などを通してOSS に貢献。「業界を驚かせるレベルでテクノロジーの開拓を行い、業界ルールをイノベーションにより変革する」を掲げ、本書は社内ラボ組織たるATL が主導。
目次
目次
日本語版序文
- 著者について
- レビュワーについて
序文
- 本書のカバーしている範囲
- 本書を読むのに必要なもの
- 対象読者
- 表記について
- サンプルコードのダウンロード
- 正誤表
第1章 ElasticSearchクラスタ入門
- 1.1 ElasticSearchとは何か?
- 1.1.1 インデックス(Index)
- 1.1.2 ドキュメント(Document)
- 1.1.3 ドキュメントタイプ(Document type)
- 1.1.4 ノード(Node)とクラスタ(Cluster)
- 1.1.5 シャード(Shard)
- 1.1.6 レプリカ(Replica)
- 1.2 クラスタのインストールと設定
- 1.3 ディレクトリ構造
- 1.4 ElasticSearchの設定
- 1.5 ElasticSearchの起動
- 1.6 ElasticSearchの停止
- 1.7 システムサービスとしてElasticSearchを起動
- 1.8 REST APIによるデータ操作
- 1.8.1 RESTとは?
- 1.8.2 ElasticSearchへのデータの保存
- 1.8.3 新規ドキュメントの作成
- 1.8.4 ドキュメントの取得
- 1.9 ドキュメントの更新
- 1.9.1 ドキュメントの削除
- 1.10 手動によるインデックス作成とマッピング構成
- 1.10.1 インデックス(Index)
- 1.10.2 タイプ
- 1.10.3 インデックスの操作
- 1.10.4 スキーママッピング(Schema mapping)
- 1.10.5 タイプ(Document Type)定義
- 1.10.6 フィールド
- 1.10.7 基本型(Core types)
- 1.10.8 マルチフィールド(Multi fields)
- 1.10.9 アナライザの使用
- 1.10.10 ドキュメントソースの保存
- 1.10.11 _allフィールド
- 1.11 ダイナミックマッピングとテンプレート
- 1.11.1 型決定メカニズム(Type determining mechanism)
- 1.11.2 ダイナミックマッピング(Dynamic mappings)
- 1.11.3 テンプレート
- 1.12 ルーティングの動作
- 1.12.1 インデキシングはどのように動作するか?
- 1.12.2 検索はどのように動作するのか?
- 1.12.3 ルーティング(Routing)
- 1.12.4 ルーティングパラメータ(Routing parameters)
- 1.12.5 フィールドによるルーティング
- 1.13 インデックスエイリアス(Index aliasing)と日常業務の簡素化
- 1.13.1 エイリアス(alias)
- 1.13.2 エイリアスの作成
- 1.13.3 エイリアスの変更
- 1.13.4 コマンドの組み合わせ
- 1.13.5 すべてのエイリアスを取得
- 1.13.6 エイリアスのフィルタリング
- 1.13.7 エイリアスとルーティング
- 1.14 まとめ
第2章 データの検索
- 2.1 クエリによる検索とインデックス作成プロセスを理解する
- 2.2 マッピング(Mappings)
- 2.2.1 データ
- 2.3 ElasticSearchでの検索
- 2.3.1 シンプルなクエリ
- 2.3.2 ページングと検索結果のサイズ
- 2.3.3 バージョンの取得
- 2.3.4 スコアによる制限
- 2.3.5 取得するフィールドの指定
- 2.3.6 scriptフィールドの使用
- 2.3.7 適切な検索タイプの選択(上級者向け)
- 2.3.8 検索実行の優先(上級者向け)
- 2.4 基本的なクエリ
- 2.4.1 termクエリ
- 2.4.2 termsクエリ
- 2.4.3 matchクエリ
- 2.4.4 multi matchクエリ
- 2.4.5 query stringクエリ
- 2.4.6 fieldクエリ
- 2.4.7 IDsクエリ
- 2.4.8 prefixクエリ
- 2.4.9 fuzzy like thisクエリ
- 2.4.10 fuzzy like this fieldクエリ
- 2.4.11 fuzzyクエリ
- 2.4.12 match allクエリ
- 2.4.13 wildcardクエリ
- 2.4.14 more like thisクエリ
- 2.4.15 more like this fieldクエリ
- 2.4.16 rangeクエリ
- 2.4.17 クエリの書き換え
- 2.5 結果のフィルタリング
- 2.5.1 フィルタの利用
- 2.5.2 rangeフィルタ
- 2.5.3 existsフィルタ
- 2.5.4 missingフィルタ
- 2.5.5 scriptフィルタ
- 2.5.6 typeフィルタ
- 2.5.7 limitフィルタ
- 2.5.8 IDsフィルタ
- 2.5.9 その他のフィルタ
- 2.5.10 bool、and、or、notフィルタ
- 2.5.11 named(名前付き)フィルタ
- 2.5.12 フィルタのキャッシュ
- 2.6 クエリの組み合わせ
- 2.6.1 boolクエリ
- 2.6.2 boostingクエリ
- 2.6.3 constant scoreクエリ
- 2.6.4 indicesクエリ
- 2.6.5 custom filters scoreクエリ
- 2.6.6 custom boost factorクエリ
- 2.6.7 custom scoreクエリ
- 2.6.8 function scoreクエリ
- 2.7 データのソート
- 2.7.1 デフォルトソート
- 2.7.2 ソートに利用するフィールドの指定
- 2.7.3 存在しないフィールドの動作を指定する
- 2.7.4 動的条件
- 2.7.5 照合順序と各国の文字
- 2.8 スクリプトの利用
- 2.8.1 使用可能なオブジェクト
- 2.8.2 MVEL
- 2.8.3 その他の言語
- 2.8.4 スクリプトライブラリ
- 2.8.5 ネイティブコード
- 2.9 まとめ
第3章 構造や検索を拡張する
- 3.1 階層を持つデータのインデックス方法
- 3.1.1 データ
- 3.1.2 オブジェクト
- 3.1.3 配列
- 3.1.4 マッピング
- 3.1.5 mappingを指定するか動的定義をするべきか
- 3.1.6 マッピングの反映
- 3.2 追加の内部情報を使用してインデックス構造を拡張
- 3.2.1 IDフィールド
- 3.2.2 _typeフィールド
- 3.2.3 _allフィールド
- 3.2.4 _sourceフィールド
- 3.2.5 _boostフィールド
- 3.2.6 _indexフィールド
- 3.2.7 _sizeフィールド
- 3.2.8 _timestampフィールド
- 3.2.9 _ttlフィールド
- 3.3 ハイライティング
- 3.3.1 ハイライティングことはじめ
- 3.3.2 フィールドの構成
- 3.3.3 内部の仕組み
- 3.3.4 HTMLタグの設定
- 3.3.5 ハイライトをコントロールする
- 3.3.6 グローバルおよびローカル設定
- 3.3.7 マッチングを強制する
- 3.4 オートコンプリート
- 3.4.1 prefixクエリ
- 3.4.2 Edge ngrams
- 3.4.3 ファセッティング
- 3.5 ファイルからのインデキシング
- 3.5.1 ファイルについての追加情報
- 3.6 Geo
- 3.6.1 座標検索のためのマッピングを準備する
- 3.6.2 サンプルデータ
- 3.6.3 サンプルクエリ
- 3.6.4 バウンディングボックスフィルタリング
- 3.6.5 距離による制限
- 3.7 まとめ
第4章 よりよい検索
- 4.1 ドキュメントが見つかった理由
- 4.1.1 フィールドがどのようにアナライズされるか理解する
- 4.1.2 クエリの詳細
- 4.2 クエリブーストでスコアに作用する
- 4.2.1 ブーストとは?
- 4.2.2 クエリのブースト
- 4.2.3 スコアの改変
- 4.3 インデックス時のブーストが有用な場合
- 4.3.1 入力データでのフィールドブーストの定義
- 4.3.2 入力データでのドキュメントブーストの定義
- 4.3.3 マッピングでのブーストの定義
- 4.4 同じ意味を持つ語
- 4.4.1 synonymフィルタ(類義語フィルタ)
- 4.4.2 類義語ルールの定義
- 4.4.3 クエリ解析時、もしくは、インデックス時の類義語展開
- 4.5 異なる言語でコンテンツを検索
- 4.5.1 言語を別々に扱う必要性
- 4.5.2 多言語を扱う方法
- 4.5.3 ドキュメントの言語判定
- 4.5.4 サンプルドキュメント
- 4.5.5 マッピング
- 4.5.6 クエリの発行
- 4.6 spanクエリ(スパンクエリ)の利用
- 4.6.1 スパンとは何か?
- 4.6.2 span termクエリ(スパン語句クエリ)
- 4.6.3 span firstクエリ(スパン先頭クエリ)
- 4.6.4 span nearクエリ(スパン近傍クエリ)
- 4.6.5 span ORクエリ(スパンORクエリ)
- 4.6.6 span NOTクエリ(スパンNOTクエリ)
- 4.6.7 パフォーマンス考察
- 4.7 まとめ
第5章 インデキシング、アナライズ、検索の統合
- 5.1 木構造データのインデキシング
- 5.2 マッピング更新APIを使ったインデックスの変更
- 5.2.1 マッピングの作成
- 5.2.2 フィールドの追加
- 5.2.3 フィールドの修正
- 5.3 ネストされたオブジェクトの使い方
- 5.4 親子関係を持つデータの使い方
- 5.4.1 マッピングとインデキシング
- 5.4.2 クエリの実行
- 5.4.3 親子関係とフィルタリング
- 5.4.4 パフォーマンスについて
- 5.5 外部システムからのデータの取り込み:リバー(River)
- 5.5.1 リバーとは
- 5.5.2 リバーのインストールと設定
- 5.6 バッチ処理によるインデキシングの高速化
- 5.6.1 データの準備
- 5.6.2 データのインデキシング
- 5.6.3 さらなる高速化
- 5.7 まとめ
第6章 検索を越えて
- 6.1 ファセット
- 6.1.1 ドキュメント構造
- 6.1.2 返却結果
- 6.1.3 queryファセット
- 6.1.4 filterファセット
- 6.1.5 termsファセット
- 6.1.6 rangeファセット
- 6.1.7 数値と日付のhistogramファセット
- 6.1.8 statisticalファセット
- 6.1.9 terms statisticalファセット
- 6.1.10 geo distanceファセット
- 6.1.11 ファセットによる結果のフィルタリング
- 6.1.12 ファセット計算のスコープ(適用範囲)
- 6.1.13 ファセットのメモリ使用に関する考察
- 6.2 more like this(類似検索)
- 6.2.1 サンプルデータ
- 6.2.2 類似ドキュメントを検索
- 6.3 パーコレータ(percolator)
- 6.3.1 パーコレータの準備
- 6.3.2 より深く
- 6.4 まとめ
第7章 クラスタ管理
- 7.1 クラスタ状態の監視
- 7.1.1 cluster health API(クラスタヘルスチェックAPI)
- 7.1.2 indices stats API(インデックス統計情報API)
- 7.1.3 status API(ステータスAPI)
- 7.1.4 nodes info API(ノード情報API)
- 7.1.5 nodes stats API(ノード統計情報API)
- 7.1.6 cluster state API(クラスタ状態API)
- 7.1.7 indices segments API(インデックスセグメントAPI)
- 7.2 シャードやレプリカの配置制御
- 7.2.1 明確な配置制御
- 7.2.2 クラスタ全体配置(cluster-wide)
- 7.2.3 ノードのシャード/レプリカ数
- 7.2.4 シャード/レプリカの移動(手動)
- 7.3 インスタンスやクラスタ状態の診断ツール
- 7.3.1 Bigdesk
- 7.3.2 elasticsearch-head
- 7.3.3 elasticsearch-paramedic
- 7.4 ElasticSearchタイムマシン
- 7.4.1 ゲートウェイ(gateway)モジュール
- 7.4.2 リカバリ制御
- 7.5 ノードディスカバリ (node discovery)
- 7.5.1 探索タイプ(Discovery types)
- 7.5.2 マスタノード
- 7.5.3 クラスタ名の設定
- 7.5.4 マルチキャスト設定
- 7.5.5 ユニキャスト設定
- 7.5.6 ノードのping設定
- 7.6 ElasticSearchプラグイン
- 7.6.1 プラグインのインストール
- 7.6.2 プラグインの削除
- 7.6.3 プラグインの種類
- 7.7 まとめ
第8章 問題への対処
- 8.1 なぜページングするほど遅くなるのか
- 8.1.1 何が問題なのか
- 8.1.2 スクロール機能で解決
- 8.2 クラスタのリバランスを制御
- 8.2.1 リバランスとは何か
- 8.2.2 クラスタが利用可能になるのはいつ?
- 8.2.3 クラスタのリバランス設定
- 8.3 クエリのバリデート
- 8.3.1 validate APIの使い方
- 8.4 インデックスのウォームアップ
- 8.4.1 ウォーミングクエリの追加
- 8.4.2 定義済みウォーミングクエリの取得
- 8.4.3 ウォーミングクエリの削除
- 8.4.4 ウォームアップの無効化
- 8.4.5 どんなクエリを選ぶべきか
- 8.5 まとめ
付録A ログ可視化・分析ツールKibana
- A.1 はじめに
- A.2 セットアップ
- A.2.1 Apacheログの生成
- A.2.2 fluentdを使ってログを取り込む
- A.2.3 logstashを使ってログを取り込む
- A.2.4 Kibanaのインストール
- A.2.5 mapping
- A.2.6 ログをインデックスする
- A.3 基本的な使い方
- A.3.1 Panelを追加する
- A.3.2 Panelの設定を変更する
- A.3.3 設定を保存する
- A.3.4 クエリの結果を表示する
- A.3.5 histogramの表示方法を変更する
- A.4 便利な使い方
- A.4.1 レスポンスタイムが1ミリ秒を超えたリクエストの回数を見る
- A.4.2 平均レスポンスタイムを見る
- A.4.3 ステータスコードごとのリクエスト数を見る
- A.5 おわりに
付録B ElasticSearchの日本語処理について
- B.1 N-Gramの利用
- B.1.1 ngramトークナイザ
- B.2 形態素解析の利用
- B.3 Kuromojiプラグイン
- B.3.1 Kuromojiとは
- B.3.2 プラグインのインストール
- B.3.3 利用できるアナライザ、トークナイザ、フィルタ
- B.4 日本語処理で気をつけるべき点
- B.4.1 全角、半角文字の正規化
- B.4.2 クエリの注意点
- B.4.3 複合語での検索