elasticsearch6.5.4搜索(4.复合查询)
1.布尔查询
可以通过布尔查询来 装无限数量的查询,并通过下面描述的节点之一使用一个逻辑值来连接它们。
- should:被它 装的布尔查询可能被匹配,也可能不被匹配。被匹配的should节点数目 由minimum_should_match参数控制。
- must:被它 装的布尔查询必须被匹配,文档才会返回。
- must_not:被它 装的布尔查询必须不被匹配,文档才会返回。
上述每个节点都可以在单个布尔查询中出现多次。这允许建立非常复杂的查询,有多个嵌套 别(在一个布尔查询中包含另一个布尔查询)。
假设我们想要找到所有这样的文档:在title字段中含有crime词条,并且year字段可以在 也可以不在1900~2000的范围里,在otitle字段中不可以包含nothing词条。用布尔查询的话, 类似于下面的代码:
{
"query": {
"bool": {
"must": {
"term": {
"title": "crime"
}
},
"should": {
"range": {
"year": {
"from": 1900,
"to": 2000
}
}
},
"must_not": {
"term": {
"otitle": "nothing"
}
}
}
}
}
注意:must,should和must_not节点可以 一查询,也可以 多 个查询。
2.加权查询
加权查询封装了两个查询,并且降低其中一个查询返回文档的得分。加权查询中有三个节点 需要定义:positive部分,包含所返回文档得分不会被改变的查询;negative部分,返回的文 档得分将被降 ;negative_boost部分,包含用来降 negative部分查询得分的加权值。
加权查询的优点是,positive部分和negative部分包含的查询结果都会出现在搜索结果 中,而某些查询的得分将被降 。如果使用布尔查询的must_not节点,将得不到这样的结果。
假设我们想要一个简单的词条查询,查询title字段中含有crime词条,希望这样的文档得 分不被改变,同时要year字段在1800~1900内的文档,但这样文档的得分要有一个0.5的加权。这 样的查询如下所示:
{
"query": {
"boosting": {
"positive": {
"term": {
"title": "crime"
}
},
"negative": {
"range": {
"year": {
"from": 1800,
"to": 1900
}
}
},
"negative_boost": 0.5
}
}
}