Elasticsearch Search API

主な4種類の検索条件

Query DSLではmatchtermrangeboolを利用でき、sortで結果を並べ替えられる。

POST /_bulk
{ "index": { "_index": "demo_search", "_id": "1" }}
{ "text": "This is Elasticsearch test." }
{ "index": { "_index": "demo_search", "_id": "2" }}
{ "text": "Elasticsearch is God." }
{ "index": { "_index": "demo_search", "_id": "3" }}
{ "text": "This is a pen." }

条件なしのGET /demo_search/_searchは3件すべてを返す。

matchとmatch_phrase

matchは解析済みの単語に対する全文検索である。

GET /demo_search/_search
{"query":{"match":{"text":"Elasticsearch"}}}

文書1と2を返す。複数語は既定でORとなり、すべて必要なら"operator":"AND"を指定する。match_phraseは語順も要求するため、Elasticsearch testは文書1に一致するが、逆順は一致しない。

{"query":{"match_phrase":{"text":{"query":"Elasticsearch test"}}}}

termとterms

termは完全一致であり、通常は未解析のkeywordフィールドに使う。

{"query":{"term":{"text.keyword":"This is Elasticsearch test."}}}

text.keywordElasticsearchだけで検索しても完全一致しない。解析済みtextに全文を指定しても、格納時に単語へ分割されているため一致しない。複数の完全一致候補にはtermsを使う。

{"query":{"terms":{"text.keyword":[
 "This is Elasticsearch test.", "This is a pen."
]}}}

range

POST /_bulk
{ "index": { "_index": "test_range", "_id": "1" }}
{ "date": "2000/01/01 09:00:00+0900" }
{ "index": { "_index": "test_range", "_id": "2" }}
{ "date": "2010/08/01 09:00:00+0900" }
{ "index": { "_index": "test_range", "_id": "3" }}
{ "date": "2020/11/01 09:00:00+0900" }
{"query":{"range":{"date":{
 "gte":"2010/01/01 09:00:00+0900",
 "lte":"2030/01/01 09:00:00+0900"
}}}}

この範囲には文書2と3が含まれる。

bool

mustはAND、shouldはOR、must_notは除外、filterはスコアへ影響せず候補を限定する。

POST /_bulk
{ "index": { "_index": "demo_bool", "_id": "1" }}
{ "text": "This is Elasticsearch test.", "id": 1 }
{ "index": { "_index": "demo_bool", "_id": "2" }}
{ "text": "Elasticsearch is God.", "id": 2 }
{ "index": { "_index": "demo_bool", "_id": "3" }}
{ "text": "This is a pen.", "id": 3 }
{"query":{"bool":{"must":[
 {"match":{"text":"Elasticsearch"}},
 {"range":{"id":{"lte":1}}}
]}}}

mustは文書1、同じ条件のshouldは文書1と2、must_notは文書3を返す。

{"query":{"bool":{
 "must":[{"match":{"text":"Elasticsearch"}}],
 "filter":[{"range":{"id":{"lte":1}}}]
}}}

このfilterはIDを1以下に限定し、文書1だけを返す。

sortとその他の指定

GET /demo_bool/_search
{"sort":[{"id":{"order":"desc"}}]}

ID 3、2、1の順で返す。match_allは全件、multi_matchは複数フィールドを検索する。sizeは件数、fromは開始位置、_sourceは返却フィールド、aggsは集計を指定する。