Amazon Elasticsearch Service
開発者ガイド (API バージョン 2015-01-01)

Amazon Elasticsearch Service でのデータの検索

検索エンジンから予想できるように、Elasticsearch では、データの検索用の様々なオプションが用意されています。この章では、Amazon ES を使用して検索を実行するいくつかの一般的な方法を紹介しています。Postman を使用してさまざまなリクエストをテストできます。Amazon ES への署名付き HTTP リクエストを送信するサンプルコードについては、「Amazon Elasticsearch Service への HTTP リクエストの署名」を参照してください。

注記

この章の例のリクエストはすべて、Elasticsearch 6.x API を使用します。一部のリクエストでは古い Elasticsearch バージョンを使用できない可能性があります。

URI 検索

Universal Resource Identifier (URI) 検索は、最もシンプルな検索方法です。URI 検索では、HTTP リクエストパラメータとしてクエリを指定します。

GET https://search-my-domain.us-west-1.es.amazonaws.com/_search?q=house

以下にレスポンスの例を示します。

{ "took": 25, "timed_out": false, "_shards": { "total": 10, "successful": 10, "skipped": 0, "failed": 0 }, "hits": { "total": 85, "max_score": 6.6137657, "hits": [ { "_index": "movies", "_type": "movie", "_id": "tt0077975", "_score": 6.6137657, "_source": { "directors": [ "John Landis" ], "release_date": "1978-07-27T00:00:00Z", "rating": 7.5, "genres": [ "Comedy", "Romance" ], "image_url": "http://ia.media-imdb.com/images/M/MV5BMTY2OTQxNTc1OF5BMl5BanBnXkFtZTYwNjA3NjI5._V1_SX400_.jpg", "plot": "At a 1962 College, Dean Vernon Wormer is determined to expel the entire Delta Tau Chi Fraternity, but those troublemakers have other plans for him.", "title": "Animal House", "rank": 527, "running_time_secs": 6540, "actors": [ "John Belushi", "Karen Allen", "Tom Hulce" ], "year": 1978, "id": "tt0077975" } }, ... ] } }

デフォルトでは、このクエリはという語句をすべてのインデックスのすべてのフィールドで検索します。検索を絞り込むには URI でインデックス (movies) およびドキュメントフィールド (title) を指定します。

GET https://search-my-domain.us-west-1.es.amazonaws.com/movies/_search?q=title:house

リクエストに追加のパラメータを含めることができますが、サポートされているパラメータはごく一部分の Elasticsearch 検索オプションのみを提供します。次のリクエストは 20 の結果 (デフォルトでは 10) を返し、年ごとに (_score ではなく) ソートされます。

GET https://search-my-domain.us-west-1.es.amazonaws.com/movies/_search?q=title:house&size=20&sort=year:desc

リクエストボディ検索

より複雑な検索を実行するには、HTTP リクエストボディと、クエリの Elasticsearch ドメイン固有言語 (DSL) を使用します。クエリ DSL では、Elasticsearch 検索オプションの全範囲を指定することができます。次の match クエリでは、最終的な URI 検索の例と似ています。

POST https://search-my-domain.us-west-1.es.amazonaws.com/movies/_search { "size": 20, "sort": { "year": { "order": "desc" } }, "query": { "query_string": { "default_field": "title", "query": "house" } } }

注記

_search API はリクエストボディ検索のための HTTP GET および POST を受け入れます。ただし、すべての HTTP クライアントが GET リクエストにリクエストボディを追加することをサポートしているわけではありません。POST は普遍的な選択です。

多くの場合、いくつかのフィールドを検索する必要がある場合がありますが、すべてのフィールドを検索する必要はありません。multi_match クエリを使用します。

POST https://search-my-domain.us-west-1.es.amazonaws.com/movies/_search { "size": 20, "query": { "multi_match": { "query": "house", "fields": ["title", "plot", "actors", "directors"] } } }

ブーストフィールド

特定のフィールドをブーストすることで、検索の関連性を向上させることができます。ブーストは乗数で、あるフィールドの一致を他のフィールドの一致より重く重み付けします。次の例では、title フィールドでの john の一致は、plot フィールドでの一致の 2 倍、actors または directors フィールドでの一致の 4 倍、_score に影響します。その結果、John WickJohn Carter のような映画が検索結果の最上部にあり、John Travolta 主演の映画は最下部にあります。

POST https://search-my-domain.us-west-1.es.amazonaws.com/movies/_search { "size": 20, "query": { "multi_match": { "query": "john", "fields": ["title^4", "plot^2", "actors", "directors"] } } }

検索結果のページ分割

大量の検索結果を表示する必要がある場合は、from パラメータを使用してページ分割を実装できます。次のリクエストは、検索結果のゼロから始まるインデックスリストのうち、20 – 39 までの結果を返します。

POST https://search-my-domain.us-west-1.es.amazonaws.com/movies/_search { "from": 20, "size": 20, "query": { "multi_match": { "query": "house", "fields": ["title^4", "plot^2", "actors", "directors"] } } }

検索結果のハイライト

highlight オプションは、クエリが 1 つ以上のフィールドに一致した場合、hits 配列内にある追加のオブジェクトを返すよう Elasticsearch に指示します。

POST https://search-my-domain.us-west-1.es.amazonaws.com/movies/_search { "size": 20, "query": { "multi_match": { "query": "house", "fields": ["title^4", "plot^2", "actors", "directors"] } }, "highlight": { "fields": { "plot": {} } } }

クエリが plot フィールドのコンテンツに一致した場合、ヒットは次のようになります。

{ "_index": "movies", "_type": "movie", "_id": "tt0091541", "_score": 11.276199, "_source": { "directors": [ "Richard Benjamin" ], "release_date": "1986-03-26T00:00:00Z", "rating": 6, "genres": [ "Comedy", "Music" ], "image_url": "http://ia.media-imdb.com/images/M/MV5BMTIzODEzODE2OF5BMl5BanBnXkFtZTcwNjQ3ODcyMQ@@._V1_SX400_.jpg", "plot": "A young couple struggles to repair a hopelessly dilapidated house.", "title": "The Money Pit", "rank": 4095, "running_time_secs": 5460, "actors": [ "Tom Hanks", "Shelley Long", "Alexander Godunov" ], "year": 1986, "id": "tt0091541" }, "highlight": { "plot": [ "A young couple struggles to repair a hopelessly dilapidated <em>house</em>." ] } }

デフォルトでは、Elasticsearch は一致する文字列を <em> タグで囲み、一致した文字列の前後 100 文字のコンテキストを提供します。また、区切り記号、スペース、タブ、改行を識別してコンテンツをセンテンスに分割します。これらの設定はすべてカスタマイズ可能です。

POST https://search-my-domain.us-west-1.es.amazonaws.com/movies/_search { "size": 20, "query": { "multi_match": { "query": "house", "fields": ["title^4", "plot^2", "actors", "directors"] } }, "highlight": { "fields": { "plot": {} }, "pre_tags": "<strong>", "post_tags": "</strong>", "fragment_size": 200, "boundary_chars": ".,!? " } }

Count API

ドキュメントの内容に関心がなく、一致の数だけを知りたい場合は、_search API の代わりに _count API を使用できます。次のリクエストでは、query_string クエリを使用してロマンチックコメディを識別します。

POST https://search-my-domain.us-west-1.es.amazonaws.com/movies/_count { "query": { "query_string": { "default_field": "genres", "query": "romance AND comedy" } } }

以下にレスポンスの例を示します。

{ "count": 564, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 } }

このページの内容: