Elasticsearch Search API
主な4種類の検索条件
Query DSLではmatch、term、range、boolを利用でき、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.keywordをElasticsearchだけで検索しても完全一致しない。解析済み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は集計を指定する。