摘要:本文介紹ES的query子句的語法,query子句主要用于編寫查詢條件,類似SQL中的where語句,匹配單個字段,通過match實現全文搜索,全文搜索后面在單獨介紹...
本文介紹ES的query子句的語法,query子句主要用于編寫查詢條件,類似SQL中的where語句。
一、匹配單個字段
通過 match 實現全文搜索,全文搜索后面在單獨介紹,這里指的是簡單的用法:
POST /{索引名}/_search { "query": { "match": { "{FIELD}": "{TEXT}" } } }
{FIELD} - 就是我們需要匹配的字段名
{TEXT} - 就是我們需要匹配的內容
如果 {FIELD} 字段的數據類型是text類型,搜索關鍵詞會進行分詞處理。
二、精確匹配單個字段
如果我們想要類似SQL語句中的等值匹配,不需要進行分詞處理,例如:訂單號、手機號、時間字段,不需要分值處理,只要精確匹配。通過 term 實現精確匹配語法:
POST /{索引名}/_search { "query": { "term": { "{FIELD}": "{VALUE}" } } }
{FIELD} - 就是我們需要匹配的字段名
{VALUE} - 就是我們需要匹配的內容,除了TEXT類型字段以外的任意類型。
類似SQL語句:
select * from table_name where title = "yzmcms"
三、通過terms實現SQL的IN語句
如果我們要實現SQL中的in語句,一個字段包含給定數組中的任意一個值就匹配:
POST /{索引名}/_search { "query": { "terms": { "{FIELD}": [ "{VALUE1}", "{VALUE2}" ] } } }
{FIELD} - 就是我們需要匹配的字段名
{VALUE1}, {VALUE2} .... {VALUE N} - 就是我們需要匹配的內容,除了TEXT類型字段以外的任意類型。
類似SQL語句:
select * from table_name where {FIELD} in ({VALUE1},{VALUE2})
四、范圍查詢
通過 range 實現范圍查詢,類似SQL語句中的>, >=, <, <=表達式:
POST /{索引名}/_search { "query": { "range": { "{FIELD}": { "gte": 10, "lte": 20 } } } }
{FIELD} - 字段名
gte范圍參數 - 等價于 >=
gt范圍參數 - 等價于 >
lte范圍參數 - 等價于 <=
lt范圍參數 - 等價于 <
范圍參數可以只寫一個,例如:僅保留 "gte": 10, 則代表 FIELD字段 >= 10
類似SQL:
select * from table_name where id >= 10 and id <= 20
五、bool組合查詢
前面的例子都是設置單個字段的查詢條件,如果需要編寫類似SQL的Where語句,組合多個字段的查詢條件,可以使用bool語句。
在ES中bool查詢就是用來組合布爾查詢條件,布爾查詢條件,就是類似SQL中的and (且)、or (或),在SQL中,我們需要and和or,還有括號來組合查詢條件,在ES中使用bool查詢可用做到同樣的效果。
POST /{索引名}/_search { "query": { "bool": { // bool查詢 "must": [], // must條件,類似SQL中的and, 代表必須匹配條件 "must_not": [], // must_not條件,跟must相反,必須不匹配條件 "should": [] // should條件,類似SQL中or, 代表匹配其中一個條件 } } }
可以任意選擇must、must_not和should條件的參數都是一個數組,意味著他們都支持設置多個條件。
must條件
POST /{索引名}/_search { "query": { "bool": { "must": [ {匹配條件1}, {匹配條件2}, ...可以有N個匹配條件... ] } } }
例子:
POST /order/_search { "query": { "bool": { "must": [ { "term": { "order_no": "202201012356" } }, { "term": { "shop_id": 123 } } ] } } }
等價SQL:
select * from order where order_no="202201012356" and shop_id=123
must_not條件
POST /{索引名}/_search { "query": { "bool": { "must_not": [ {匹配條件1}, {匹配條件2}, ...可以有N個匹配條件... ] } } }
例子:
POST /order/_search { "query": { "bool": { "must_not": [ { "term": { "shop_id": 1 } }, { "term": { "shop_id": 2 } } ] } } }
等價SQL:
select * from order where shop_id != 1 and shop_id != 2
should條件
POST /{索引名}/_search { "query": { "bool": { "should": [ {匹配條件1}, {匹配條件2}, …可以有N個匹配條件… ] } } }
例子:
POST /order/_search { "query": { "bool": { "should": [ { "match": { "order_no": "202201012355" } }, { "match": { "order_no": "202201012356" } } ] } } }
等價SQL:
select * from order where order_no="202201012355" or order_no="202201012356"
bool綜合例子:
POST /order/_search { "query": { "bool": { "should": [ { "bool": { "must": [ { "term": { "order_no": "20220101789" } }, { "range": { "shop_id": { "gte": 10, "lte": 20 } } } ] } }, { "terms": { "typeid": [ 1, 2, 3 ] } } ] } } }
等價SQL:
select * from order where (order_no='20220101789' and (shop_id>=10 and shop_id<=20)) or typeid in (1,2,3)