Elasticsearch2.x 全文检索之——查询合并
查询合并(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个词,那么它的相关度会更高。