文章目录
Elasticsearch中的bool
查询详解
Elasticsearch是一个强大的搜索引擎,它提供了丰富的查询功能,以帮助你从大规模数据集中检索相关的文档。在Elasticsearch中,bool
查询是一个非常重要和强大的工具,它允许组合多个查询子句,以构建复杂的查询逻辑。在本篇文章中,我们将深入探讨bool
查询,包括其概述、参数、各个子句的详解以及多子句嵌套的示例。
1. bool语法概述
bool
查询是Elasticsearch中的布尔查询,它允许组合多个查询条件以过滤和排序文档。bool
查询有四个主要子句:
must
:所有的查询子句都必须匹配,类似于"AND"操作。should
:至少一个查询子句必须匹配,类似于"OR"操作。must_not
:查询子句不应该匹配,类似于"NOT"操作。filter
:与must
相似,但不会影响查询的相关性得分。
bool
查询具有以下特点
- 内部可以包含多个全文检索和精确查询语法
- 子查询可以任意顺序出现
- 可以嵌套多个查询,包括bool查询
- 如果bool查询中没有must条件,should中必须至少满足一条才会返回结果。
2. bool参数说明及示例
在使用bool
查询时,有一些重要的参数可以用来进一步控制查询的行为,包括:
minimum_should_match
:指定在should
查询子句中至少要匹配多少条件才算查询成功。disable_coord
:控制是否计算每个条件的坐标因子以调整查询的相关性得分。adjust_pure_negative
:控制是否调整纯负面条件的得分。boost
:为整个bool
查询指定一个权重,以影响其在整个查询中的相关性得分。
2.1. minimum_should_match
参数
minimum_should_match
参数用于指定在should
查询子句中至少要匹配多少条件才算查询成功。这个参数非常有用,因为它可以帮助我们平衡查询的精确性和宽容度。
{
"query": {
"bool": {
"should": [
{ "match": { "title": "Elasticsearch" } },
{ "match": { "content": "Kibana" } }
],
"minimum_should_match": 1
}
}
}
在上面的查询中,我们要求至少要匹配一个should
条件才算查询成功。
补充说明:
参数有以下形式:N表示需要满足的条件数量,S表示条件总数 (1)正整数 N = X,比如给定值为3,那么 N=3。
(2)负整数 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 多个条件规范可以用空格分隔。每个条件规范仅对大于其前一个的数字有效。
在此示例中:如果有1或2个子句,则都需要;如果有3-9个子句,则需要-25%(按负百分数计算);如果有9个以上的子句,则需要3个。
(7)注意:
当minimum_should_match的值大于子句数量数,DSL将检索不到值;
当minimum_should_match为0时,should子句失效。
2.2. disable_coord
参数
disable_coord
参数是一个布尔值,用于控制是否计算每个条件的坐标因子以调整查询的相关性得分。将其设置为true
可以禁用坐标因子的计算。
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } }
],
"disable_coord": true
}
}
}
2.3. adjust_pure_negative
参数
adjust_pure_negative
参数也是一个布尔值,用于控制是否调整纯负面条件的得分。默认情况下,Elasticsearch会为纯负面条件的查询调整得分,以避免它们对整体相关性得分的影响。将其设置为false
可以禁用此行为。
{
"query": {
"bool": {
"must_not": [
{ "match": { "status": "deprecated" } }
],
"adjust_pure_negative": false
}
}
}
2.4. boost
参数
boost
参数允许你为整个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查询:
{
"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
查询,包括其基本概念、重要参数以及各个查询子句的详解和示例。希望本文对你理解和使用bool
查询有所帮助,同时也能够提高你在Elasticsearch中构建复杂查询的能力。如果你有任何问题或需要进一步的帮助,请随时在评论中提出。