文章目录

Elasticsearch中的`bool`查询详解1. bool语法概述2. bool参数说明及示例2.1. `minimum_should_match`参数2.2. `disable_coord`参数2.3. `adjust_pure_negative`参数2.4. `boost`参数

3. must、should、must_not和filter详解及示例3.1.`must`3.2.`should`3.3.`must_not`3.4.`filter`

4. 多子句嵌套bool查询示例5. 结论

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中构建复杂查询的能力。如果你有任何问题或需要进一步的帮助,请随时在评论中提出。

相关阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: