Elasticsearch中的bool查詢詳解
Elasticsearch是一個強大的搜索引擎,它提供了豐富的查詢功能,以幫助你從大規(guī)模數(shù)據(jù)集中檢索相關的文檔。在Elasticsearch中,bool
查詢是一個非常重要和強大的工具,它允許組合多個查詢子句,以構建復雜的查詢邏輯。在本篇文章中,我們將深入探討bool
查詢,包括其概述、參數(shù)、各個子句的詳解以及多子句嵌套的示例。
1. bool語法概述
bool
查詢是Elasticsearch中的布爾查詢,它允許組合多個查詢條件以過濾和排序文檔。bool
查詢有四個主要子句:
-
must
:所有的查詢子句都必須匹配,類似于"AND"操作。 -
should
:至少一個查詢子句必須匹配,類似于"OR"操作。 -
must_not
:查詢子句不應該匹配,類似于"NOT"操作。 -
filter
:與must
相似,但不會影響查詢的相關性得分。
bool
查詢具有以下特點
- 內部可以包含多個全文檢索和精確查詢語法
- 子查詢可以任意順序出現(xiàn)
- 可以嵌套多個查詢,包括bool查詢
- 如果bool查詢中沒有must條件,should中必須至少滿足一條才會返回結果。
2. bool參數(shù)說明及示例
在使用bool
查詢時,有一些重要的參數(shù)可以用來進一步控制查詢的行為,包括:
-
minimum_should_match
:指定在should
查詢子句中至少要匹配多少條件才算查詢成功。 -
disable_coord
:控制是否計算每個條件的坐標因子以調整查詢的相關性得分。 -
adjust_pure_negative
:控制是否調整純負面條件的得分。 -
boost
:為整個bool
查詢指定一個權重,以影響其在整個查詢中的相關性得分。
2.1. minimum_should_match
參數(shù)
minimum_should_match
參數(shù)用于指定在should
查詢子句中至少要匹配多少條件才算查詢成功。這個參數(shù)非常有用,因為它可以幫助我們平衡查詢的精確性和寬容度。
{
"query": {
"bool": {
"should": [
{ "match": { "title": "Elasticsearch" } },
{ "match": { "content": "Kibana" } }
],
"minimum_should_match": 1
}
}
}
在上面的查詢中,我們要求至少要匹配一個should
條件才算查詢成功。
補充說明:
參數(shù)有以下形式:N表示需要滿足的條件數(shù)量,S表示條件總數(shù) (1)正整數(shù) N = X,比如給定值為3,那么 N=3。
(2)負整數(shù) N = S |X|,比如給定值為-2,那么 N= S - 2。
(3)正百分比 N = min 取整(S * X),比如 S=5,X = 25% ,那么 N= 1
(4)負百分比 N =S - min 取整(|S * X|),比如 S=5,X = -25% ,那么 N= 5 - 1 = 4。
(5)組合,比如 3<90% 當 S <= 3,則全部都是必需的;當 S > 3,則僅需要90%,按上面的正百分比計算。
(6)多種組合,比如:2<-25% 9<3 多個條件規(guī)范可以用空格分隔。每個條件規(guī)范僅對大于其前一個的數(shù)字有效。
在此示例中:如果有1或2個子句,則都需要;如果有3-9個子句,則需要-25%(按負百分數(shù)計算);如果有9個以上的子句,則需要3個。
(7)注意:
當minimum_should_match的值大于子句數(shù)量數(shù),DSL將檢索不到值;
當minimum_should_match為0時,should子句失效。
2.2. disable_coord
參數(shù)
disable_coord
參數(shù)是一個布爾值,用于控制是否計算每個條件的坐標因子以調整查詢的相關性得分。將其設置為true
可以禁用坐標因子的計算。
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } }
],
"disable_coord": true
}
}
}
2.3. adjust_pure_negative
參數(shù)
adjust_pure_negative
參數(shù)也是一個布爾值,用于控制是否調整純負面條件的得分。默認情況下,Elasticsearch會為純負面條件的查詢調整得分,以避免它們對整體相關性得分的影響。將其設置為false
可以禁用此行為。
{
"query": {
"bool": {
"must_not": [
{ "match": { "status": "deprecated" } }
],
"adjust_pure_negative": false
}
}
}
2.4. boost
參數(shù)
boost
參數(shù)允許你為整個bool
查詢指定一個權重,以影響其在整個查詢中的相關性得分。
{
"query": {
"bool": {
"should": [
{ "match": { "title": "Elasticsearch" } }
],
"boost": 2.0
}
}
}
在上面的示例中,should
查詢子句的權重被設置為2.0,從而增加了它在整個查詢中的重要性。
3. must、should、must_not和filter詳解及示例
3.1.must
must
查詢子句用于要求所有的查詢條件都必須匹配。
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } },
{ "range": { "price": { "gte": 50 } } }
]
}
}
}
在上面的查詢中,我們要求文檔的title
必須包含"Elasticsearch",而且price
必須大于或等于50。
3.2.should
should
查詢子句用于指定多個條件中至少一個必須匹配。
{
"query": {
"bool": {
"should": [
{ "match": { "title": "Elasticsearch" } },
{ "match": { "content": "Kibana" } }
]
}
}
}
在上面的查詢中,文檔可以包含"Elasticsearch"或者"Kibana",或者同時包含兩者。
should
不同情況使用的注意事項
- 如果bool查詢在must里,并且bool查詢中具有must或
filter子句,那么bool中的should查詢即使沒有匹配到,文檔也將與查詢匹配。在這種情況下,should的子句僅用于影響得分 - 如果bool查詢在filter里,則文檔至少滿足should的查詢一個條件
- 如果bool查詢既沒有在must也沒在filter,則文檔至少滿足should的查詢一個條件
3.3.must_not
must_not
查詢子句用于排除匹配某些條件的文檔。
{
"query": {
"bool": {
"must_not": [
{ "match": { "category": "Deprecated" } }
]
}
}
}
在上面的查詢中,我們排除了所有category
字段包含"Deprecated"的文檔。
3.4.filter
filter
查詢子句用于過濾文檔,但不會影響查詢的相關性得分。
{
"query": {
"bool": {
"filter": [
{ "term": { "status": "published" } },
{ "range": { "date": { "gte": "2023-01-01" } } }
]
}
}
}
在上面的查詢中,我們過濾了status
為"published"且date
大于或等于"2023-01-01"的文檔,但不會改變它們的相關性得分。
4. 多子句嵌套bool查詢示例
有時可能需要更復雜的查詢,例如組合多個bool
查詢。以下示例展示了不同語法的多子句嵌套bool查詢:文章來源:http://www.zghlxwxcb.cn/news/detail-752203.html
{
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{ "match": { "title": "Elasticsearch" } },
{ "match": { "content": "Kibana" } }
]
}
}
],
"filter": [
{ "range": { "date": { "gte": "2023-01-01" } } }
],
"must_not": [
{ "match": { "status": "deprecated" } }
]
}
}
}
5. 結論
本次介紹了Elasticsearch中的bool
查詢,包括其基本概念、重要參數(shù)以及各個查詢子句的詳解和示例。希望本文對你理解和使用bool
查詢有所幫助,同時也能夠提高你在Elasticsearch中構建復雜查詢的能力。如果你有任何問題或需要進一步的幫助,請隨時在評論中提出。文章來源地址http://www.zghlxwxcb.cn/news/detail-752203.html
到了這里,關于【Elasticsearch】 10-DSL語法詳解-復合查詢bool(must、should、must_not、filter)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!