介紹ES 的query子句的語法,query子句主要用于編寫查詢條件,類似SQL中的where語句。
query子句主要用來編寫類似SQL的Where語句,支持布爾查詢(and/or)、IN、全文搜索、模糊匹配、范圍查詢(大于小于)。
text類型字段支持分詞,可以使用模糊查詢
keyword類型只能做等值查詢,不能進(jìn)行分詞
1.匹配單個(gè)字段
通過match實(shí)現(xiàn)全文搜索,全文搜索的后面有單獨(dú)的章節(jié)講解,這里大家只要知道簡(jiǎn)單的用法就可以。
語法:
GET /{索引名}/_search
{
"query": {
"match": {
"{FIELD}": "{TEXT}"
}
}
}
說明:
{FIELD} - 就是我們需要匹配的字段名
{TEXT} - 就是我們需要匹配的內(nèi)容
例子:
GET /article/_search
{
"query": {
"match" : {
"title" : "ES教程"
}
}
}
article索引中,title字段匹配ES教程的所有文檔。
如果title字段的數(shù)據(jù)類型是text類型,搜索關(guān)鍵詞會(huì)進(jìn)行分詞處理。
**
2.精確匹配單個(gè)字段
**
如果我們想要類似SQL語句中的等值匹配,不需要進(jìn)行分詞處理,例如:訂單號(hào)、手機(jī)號(hào)、時(shí)間字段,不需要分值處理,只要精確匹配。
通過term實(shí)現(xiàn)精確匹配語法:
GET /{索引名}/_search
{
"query": {
"term": {
"{FIELD}": "{VALUE}"
}
}
}
說明:
{FIELD} - 就是我們需要匹配的字段名
{VALUE} - 就是我們需要匹配的內(nèi)容,除了TEXT類型字段以外的任意類型。
例子:
GET /order_v2/_search
{
"query": {
"term": {
"order_no": "202003131209120999"
}
}
}
搜索訂單號(hào)order_no = "202003131209120999"的文檔。
類似SQL語句:
select * from order_v2 where order_no = "202003131209120999"
3.通過terms實(shí)現(xiàn)SQL的in語句
如果我們要實(shí)現(xiàn)SQL中的in語句,一個(gè)字段包含給定數(shù)組中的任意一個(gè)值就匹配。
terms語法:
GET /order_v2/_search
{
"query": {
"terms": {
"{FIELD}": [
"{VALUE1}",
"{VALUE2}"
]
}
}
}
說明:
{FIELD} - 就是我們需要匹配的字段名
{VALUE1}, {VALUE2} … {VALUE N} - 就是我們需要匹配的內(nèi)容,除了TEXT類型字段以外的任意類型。
例子:
GET /order_v2/_search
{
"query": {
"terms": {
"shop_id": [123,100,300]
}
}
}
搜索order_v2索引中,shop_id字段,只要包含[123,100,300]其中一個(gè)值,就算匹配。
類似SQL語句:
select * from order_v2 where shop_id in (123,100,300)
**
4.范圍查詢
**
通過range實(shí)現(xiàn)范圍查詢,類似SQL語句中的>, >=, <, <=表達(dá)式。
range語法:
GET /{索引名}/_search
{
"query": {
"range": {
"{FIELD}": {
"gte": 10,
"lte": 20
}
}
}
}
參數(shù)說明:
{FIELD} - 字段名
gte范圍參數(shù) - 等價(jià)于>=
lte范圍參數(shù) - 等價(jià)于 <=
范圍參數(shù)可以只寫一個(gè),例如:僅保留 “gte”: 10, 則代表 FIELD字段 >= 10
范圍參數(shù)如下:
gt - 大于 ( > )
gte - 大于且等于 ( >= )
lt - 小于 ( < )
lte - 小于且等于 ( <= )
例子1:
GET /order_v2/_search
{
"query": {
"range": {
"shop_id": {
"gte": 10,
"lte": 200
}
}
}
}
查詢order_v2索引中,shop_id >= 10 且 shop_id <= 200的文檔
類似SQL:
select * from order_v2 where shop_id >= 10 and shop_id <= 200
例子2:
GET /order_v2/_search
{
"query": {
"range": {
"shop_id": {
"gte": 10
}
}
}
}
類似SQL:
select * from order_v2 where shop_id >= 10
**
5.bool組合查詢
**
前面的例子都是設(shè)置單個(gè)字段的查詢條件,如果需要編寫類似SQL的Where語句,組合多個(gè)字段的查詢條件,可以使用bool語句。
5.1. bool查詢基本語法結(jié)構(gòu)
在ES中bool查詢就是用來組合布爾查詢條件,布爾查詢條件,就是類似SQL中的and (且)、or (或)。
在SQL中,我們需要and和or,還有括號(hào)來組合查詢條件,在ES中使用bool查詢可用做到同樣的效果。
bool語法結(jié)構(gòu):
GET /{索引名}/_search
{
"query": {
"bool": { // bool查詢
"must": [], // must條件,類似SQL中的and, 代表必須匹配條件
"must_not": [], // must_not條件,跟must相反,必須不匹配條件
"should": [] // should條件,類似SQL中or, 代表匹配其中一個(gè)條件
}
}
}
可以任意選擇must、must_not和should條件的參數(shù)都是一個(gè)數(shù)組,意味著他們都支持設(shè)置多個(gè)條件。
提示:前面介紹的單個(gè)字段的匹配語句,都可以用在bool查詢語句中進(jìn)行組合。
5.2. must條件
類似SQL的and,代表必須匹配的條件。
語法:
GET /{索引名}/_search
{
"query": {
"bool": {
"must": [
{匹配條件1},
{匹配條件2},
...可以有N個(gè)匹配條件...
]
}
}
}
例子1:
GET /order_v2/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"order_no": "202003131209120999"
}
},
{
"term": {
"shop_id": 123
}
}
]
}
}
}
這里的Must條件,使用了term精確匹配。
等價(jià)SQL:
select * from order_v2 where order_no="202003131209120999" and shop_id=123
5.3. must_not條件
跟must的作用相反。
語法:
GET /{索引名}/_search
{
"query": {
"bool": {
"must_not": [
{匹配條件1},
{匹配條件2},
...可以有N個(gè)匹配條件...
]
}
}
}
例子:
GET /order_v2/_search
{
"query": {
"bool": {
"must_not": [
{
"term": {
"shop_id": 1
}
},
{
"term": {
"shop_id": 2
}
}
]
}
}
}
等價(jià)sql:
select * from order_v2 where shop_id != 1 and shop_id != 2
5.3. should條件
類似SQL中的 or, 只要匹配其中一個(gè)條件即可
語法:
GET /{索引名}/_search
{
"query": {
"bool": {
"should": [
{匹配條件1},
{匹配條件2},
…可以有N個(gè)匹配條件…
]
}
}
}
例子:
GET /order_v2/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"order_no": "202003131209120999"
}
},
{
"match": {
"order_no": "22222222222222222"
}
}
]
}
}
}
等價(jià)SQL:文章來源:http://www.zghlxwxcb.cn/news/detail-477843.html
select * from order_v2 where order_no="202003131209120999" or order_no="22222222222222222"
5.4. bool綜合例子
GET /order_v2/_search
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"term": {
"order_no": "2020031312091209991"
}
},
{
"range": {
"shop_id": {
"gte": 10,
"lte": 200
}
}
}
]
}
},
{
"terms": {
"tag": [
1,
2,
3,
4,
5,
12
]
}
}
]
}
}
}
等價(jià)SQL:文章來源地址http://www.zghlxwxcb.cn/news/detail-477843.html
select * from order_v2 where (order_no='202003131209120999' and (shop_id>=10 and shop_id<=200)) or tag in (1,2,3,4,5)
到了這里,關(guān)于ElasticSearch【query語法】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!