Elastic
※前提条件:本情報はAndroid Studio 1.5.1を基づいて説明してる
Elasticsearchは全文検索エンジンサービスであり、特徴:
- 「Document-Oriented」(ドキュメント指向)
- 検索対象データのビジネス要件を JSON 構造へ落とし込む(基本これだけ)
RDBとのマッピング
Cluster | Databaseクラスター。1つ以上の Node (Elasticsearch Server) で構成される | Node | DBインスタンス、RDMのDBサーバに相当 | Index | RDBの Database に相当、1つの Cluster に複数の Index を作成できる | Mapping Type | RDBの Table に相当します。1つの Index に複数の Type を作成することができます。 | Document | RDBの Row に相当、Document は複数の Field を持っていて、フラットな情報だけでなく、ネストされた情報も表現できる。JSON フォーマットで表現出来る情報をストアできる | Shard | 1つの Index を作成すると、そのパフォーマンスを分散できるように複数の Shard が作成されます。それはちょうど OS 上のディレクトリと RAID で構成されたハードディスクの関係に近いイメージです。 |
※Index は論理的な概念、Shard は物理的な概念
Elasticsearchの検索データに関連度にはスコアというものが設定されています。1ワードの検索ではこのスコアの算出にはTF/IDF(Term Frequency/Inverse Document Frequency)という考え方が採用されています。
- Mapping
フィールドの型や分析方法の設定
- Analysis
言語処理や正規化などフィールドの値の加工について
- Query DSL
JSON フォーマットによる検索条件の組み立て
{"user_id": 1, "create_date": "2016-03-15"}
- キャメルケース or スネークケースに統一する
例:user_name
- データの内容が想像できるフィールド名称にする
悪い例:user 良い例:user_name
- フィールド命名規約を作成することで将来的な設計コストも削減できる
- データ型が Nested できる
PUT my_index/my_type/1
{
"group": "fans",
"users": [
{
"first_name": "John",
"last_name": "Smith"
},
{
"first_name": "Alice",
"last_name": "White"
}
]
}
※参照:
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html
Nested Type vs Parent-Child †
Nested オブジェクトと類似したものに Parent-Child Relationship がある
Nested オブジェクトと比較したメリット・デメリットを以下にまとめました。
Parent-Child のメリット:
- 子のドキュメントを再インデックスなしに親のデータを更新できる
- 子のドキュメントは親や多の子ドキュメントに影響を与えることなく、追加、更新、削除することができる。
- 子のドキュメントは検索要求の結果として返すことができる。
Parent-Child のデメリット:
- クエリーのパフォーマンスが落ちる
- メモリを多く消費する
サーチ API(RESTful API) †
Elasticsearch のサーチ API の基本ルールは以下の URL パターンです。
GET|POST /{index}/{type}/_search
サーチ API のバリエーション
- /_search
すべてのインデックス内のすべてのタイプを対象に検索する
- /blog/_search
blog インデックス内のすべてのタイプを対象に検索する
- /blog,author/_search
blog と author インデックス内のすべてのタイプを対象に検索する
- /b*,a*/_search
b から始まるインデックスと、a から始まるインデックス内のすべてのタイプを対象に検索する
- /blog/posts/_search
blog インデックス内の posts タイプを対象に検索する
- /blog,author/posts,users/_search
blog と author インデックス内の posts と users タイプを対象に検索する
- /_all/posts,users/_search
すべてのインデックス内の posts と users タイプを対象に検索する
本番環境の検索はエイリアス名を使おう
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html
SQL では LIMIT を使って、1ページあたりの結果を取得します。Elasticsearch では、size と from パラメータを使います。
- size: 1度に検索結果を取得する数を指定します。デフォルトは10です。
- from: スキップする検索結果数を指定します。デフォルトは0です。
GET /_search?size=5
GET /_search?size=5&from=5
GET /_search?size=5&from=10
月額たった 1,050円で始められる本格的なお店のホームページ!
コメント:
|