您的位置:首页 > 其它

Elasticsearch2.x 全文检索之——查询合并

2016-10-06 21:43 447 查看

查询合并(Combining Queries)

在Combining Filters这一节我们讨论了在布尔过滤器中如何通过and/or/not逻辑来合并多个过滤子句(filte clauses),在查询中bool query跟bool filter是类似的除了一点。
在filter中它做的是一个yes/no的过滤:表示当前文档是否符合过滤条件(是否应该包含在结果集中),其结果只能是yes或no
在query中它不仅决定了文档是否包含在结果集中,同时也包含了该文档与查询文本的相似度评分

和bool filter一样bool query也通过must、must_not、should参数来组合多个查询子句(query clause),如下:
GET /my_index/my_type/_search
{
"query": {
"bool": {
"must":     { "match": { "title": "quick" }},
"must_not": { "match": { "title": "lazy"  }},
"should": [
{ "match": { "title": "brown" }},
{ "match": { "title": "dog"   }}
]
}
}
}
上面的查询中会返回那些title字段中包含了“quick”同时不包含“lazy”的文档,到这里目前这个逻辑和filter是相似的。接下来两个should子句就和bool filter中有很大不同了,它代表的含义是:如果文档中title字段不要求包含“brown”和“dog”,但是如果包含了这两个词,那么会使搜索结果的文档打分更高(也就是和我们的查询意图跟相关)

下面是查询结果:
{
"hits": [
{
"_id":      "3",
"_score":   0.70134366,
"_source": {
"title": "The quick brown fox jumps over the quick dog"
}
},
{
"_id":      "1",
"_score":   0.3312608,
"_source": {
"title": "The quick brown fox"
}
}
]
}


文档3的得分比文档1高的原因是,在文档3中title同时包含了“brown”和“dog”两个词

得分计算(重要)

在bool query中,文档的相关度_score的计算是通过bool query中所有的“must”和“should”参数指定的查询子句(query caluse)的得分除以所有的“must”和“should”子句个数和。
在bool query中must_not参数指定的查询子句是不影响文档最终得分的,它唯一的作用就是排除掉那些不符合条件的文档。



精度控制

在bool query中,“must”参数指定的查询子句是必须匹配的,“must_not”参数指定的查询子句是必须匹配的,那么“should”参数指定的查询子句需要匹配多少呢?默认情况下should子句一个都不匹配只要文档满足了上面的must和must_not子句也是会返回的,只是得分会低一点。还有一种极端情况是:如果在bool query中只指定了should子句,那么至少匹配一个子句该文档才会被返回。
和控制match query的匹配精度一样,我们可以通过minimum_should_match参数来控制should子句的匹配精度,可以指定一个正整数或者一个百分比,比如:
GET /my_index/my_type/_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "brown" }},
{ "match": { "title": "fox"   }},
{ "match": { "title": "dog"   }}
],
"minimum_should_match": 2
}
}
}
上面的bool查询表示should参数中指定的3个查询子句至少匹配2个(也可以指定66.66%),也就是说查询结果中文档的title字段必须是包含“brown”和“dog”或者“brown”和“fox”或者“dog”和“fox”,如果一个文档同时包含了这3个词,那么它的相关度会更高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息