您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
elasticSearch复合查询-布尔查询
发布时间:2021-09-07 16:06:27编辑:雪饮阅读()
ElasticSearch中复合查询有很多类型,本篇将讲述布尔查询这一类型。
复合查询包装其他复合查询或叶查询,以组合它们的结果和分数,改变它们的行为,或者从查询切换到过滤上下文。
这里为了实现布尔查询,先造点测试数据
请求正文:
{
"name":"City School", "description":"ICSE", "street":"West End", "city":"Meerut",
"state":"UP", "zip":"250002", "location":[28.9926174, 77.692485], "fees":3500,
"tags":["fully computerized production env1"], "rating":"4.5","user":{"id":"kimchy"},"age":30
}
响应正文:
{
"_index": "schools",
"_type": "school",
"_id": "4",
"_version": 4,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 7,
"_primary_term": 5
}
那么接下来我们就可以建立一个复合查询的布尔查询,主要针对上面标记黄色部分进行关键查询:
请求正文:
{
"query": {
"bool" : {
"must" : {
"term" : { "user.id" : "kimchy" }
},
"filter": {
"term" : { "tags" : "production" }
},
"must_not" : {
"range" : {
"age" : { "gte" : 10, "lte" : 20 }
}
},
"should" : [
{ "term" : { "tags" : "env1" } },
{ "term" : { "tags" : "deployed" } }
],
"minimum_should_match" : 1,
"boost" : 1.0
}
}
}
响应正文:
{
"took": 38,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.6707945,
"hits": [
{
"_index": "schools",
"_type": "school",
"_id": "4",
"_score": 1.6707945,
"_source": {
"name": "City School",
"description": "ICSE",
"street": "West End",
"city": "Meerut",
"state": "UP",
"zip": "250002",
"location": [
28.9926174,
77.692485
],
"fees": 3500,
"tags": [
"fully computerized production env1"
],
"rating": "4.5",
"user": {
"id": "kimchy"
},
"age": 30
}
}
]
}
}
在这个复合查询的布尔查询中
Must,英文意思是必须的,那么也就是must匹配的是必须要满足的条件,而must里面有用term做了精确匹配"user.id" : "kimchy",这正好符合我们上面建立的这条测试数据。
那么接下来有使用filter过滤,要过滤为"tags" : "production"这个也正好符合上面我们建立的这条测试数据。
那么再接下来就是must_not这里主要意思是必须不包括,那么这里的条件:
"range" : {
"age" : { "gte" : 10, "lte" : 20 }
}
那么这个must_not整体意思就是说age大于等于10且小于等于20的不能包含。
所以上面测试文档我们建立的age是30.
那么接下来是should子句,这里有两个子句:
"should" : [
{ "term" : { "tags" : "env1" } },
{ "term" : { "tags" : "deployed" } }
],
这里这两条子句并不一定都要满足,这取决于接下来的minimum_should_match参数的配置,minimum_should_match参数这里配置为1(表示should子句中至少要满足一个子句),然后上面测试数据中tags中正好有包含这里should的第一个子句中的env1.
那么关于minimum_should_match的解释,这里有更深的一层意思:
You can use the
minimum_should_match
parameter to specify the number or percentage of should
clauses returned documents must match.If the
bool
query includes at least one should
clause and no must
or filter
clauses, the default value is 1
. Otherwise, the default value is 0
.For other valid values, see the
minimum_should_match
parameter.其它意思和我上面差不多,关于minimum_should_match默认值,它的意思就是说,如果没有包含must(子句)匹配的那一块儿或者没有包含filter(子句)这一块儿的配置,并且包含有should中至少要有一条子句,则默认值为1,否则默认值为0。
最后就是这个boost参数了,这里据有关文献讲说是配置某个字段的相关性权重,但是它这里看起来似乎并没有关联到某个字段,那么我的理解是关联到这整个bool查询了。
因为我个人理解复合查询时bool查询只是其中一种,而同一个复合查询种有可能包含bool查询和其它类型查询的。那么这里boost为1.0,应该是单指这个bool查询权重相关性为1.0吧,我个人理解1.0可以理解为100,那么假如这里除了bool查询还有另外一个查询,假如这里总共有两个查询,那么这里bool查询权重可以设置例如0.3而另外那个查询可以设置为0.7.不过这些都只是我个人理解,暂时不太清楚如何去印证这些猜想了。就先这样了,后面学的更多时候再回头说不定就了解了。
关于boost的理解,有参考:
下面这个链接主要关注下词频和逆文档频率。
es中用的标准的相似度算法就是词频/逆文档频率。
那么本篇就暂时先到这里了。
关键字词:elasticSearch,复合查询,布尔值