ElasticSearch-复合查询
布尔查询 bool
可以将较小的查询组合成较大的查询
子句类型
类型 | 描述 |
---|---|
must | 必须匹配,贡献算分 |
filter | 过滤子句,必须不能匹配,但不贡献算分 |
should | 选择性匹配,至少满足一条,贡献算分 |
must_not | 过滤子句,必须匹配,但不贡献算分 |
案例
POST user/_search
{
"query":{
"bool":{
"must":{ //must_not should filter
"term":{"name":"zhangsan"}
}
}
}
}
提高查询 boosting
不同于bool查询,bool查询种只要一个子查询条件不匹配那么搜索的数据就不会出现。而boosting则是降低显示的权重(score)
子句类型
参数 | 描述 |
---|---|
positive | 指定希望执行的查询子句,返回的结果都将满足该子句的条件 |
negative | 用于降低匹配文档的相似度分 |
negative_boost | 浮点数,介于0-1.0之间,用于降低匹配文档的相似分 |
此三个属性在boosting种需要同时出现
计算分数
若一个匹配返回的文档既满足positive又满足negative时
- 获取从positive查询中的原始分数
- 将获取的分数与negative_boost相乘得到最终分
案例
GET user/_search
{
"query": {
"boosting": {
"positive": {
"term": {
"name": {
"value": "zhangsan"
}
}
},
"negative": {
"term": {
"age": {
"value": 20
}
}
},
"negative_boost": 0.1
}
}
}
固定分数查询 constant_score
查询某个条件时,固定的返回指定的score
显然不需要计算score时,只需要filter条件即可,因为filter忽略score
案例
GET user/_search
{
"query":{
"constant_score":{
"filter":{
"term":{"age":20}
},
"boost":1.2 //所有符合条件的结果评分都是1.2
}
}
}
最佳匹配查询 dis_max
分离最大化查询(disjunction max query)指的是:将任何与任一查询匹配的文档作为结果返回,但只将最佳匹配的评分作为查询的评分结果返回
bool是会将每个符合条件的子查询的分数相加计算出,这个文档的最终得分
子查询
参数 | 描述 |
---|---|
queries | 包含一个或者多个查询子句。返回的文档必须匹配其中一个或者多个。如果文档匹配了多个,则返回最高得分 |
tie_breaker | 一个介于0-1.0之间的float数,用于当文档匹配了多个查询子句时提升相关分数。默认为0.0 |
案例
GET user/_search
{
"query":{
"dis_max":{
"queries": [
{"match":{"name":"zhangsan"}},
{"match":{"age":20}}
],
"tie_breaker":0
}
}
}