dis_max查询
相比使用bool
查询,我们可以使用dis_max
查询(Disjuction Max Query)。Disjuction的意思"OR"(而Conjunction的意思是"AND"),因此Disjuction Max Query的意思就是返回匹配了任何查询的文档,并且分值是产生了最佳匹配的查询所对应的分值:
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Brown fox" }},
{ "match": { "body": "Brown fox" }}
]
}
}
}
可以发现,两份文档的分值是一模一样的。
我们期望的是同时匹配了title
字段和body
字段的文档能够拥有更高的排名,但是结果并非如此。需要记住:dis_max
查询只是简单的使用最佳匹配查询子句得到的_score
。
tie_breaker
但是,将其它匹配的查询子句考虑进来也是可能的。通过指定tie_breaker
参数:
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Quick pets" }},
{ "match": { "body": "Quick pets" }}
],
"tie_breaker": 0.3
}
}
}
现在文档2的分值比文档1稍高一些。
tie_breaker
参数会让dis_max
查询的行为更像是dis_max
和bool
的一种折中。它会通过下面的方式改变分值计算过程:
- 取得最佳匹配查询子句的
_score
。 - 将其它每个匹配的子句的分值乘以
tie_breaker
。 - 将以上得到的分值进行累加并规范化。
通过tie_breaker
参数,所有匹配的子句都会起作用,只不过最佳匹配子句的作用更大。
/caiyun_index/spider_result/_search post
{
"query": {"multi_match": {
"query": "test",
"type": "best_fields",
"fields": [
"title",
"文本",
"url",
"附件.pdf",
"附件.others",
"附件.picture"
],
"tie_breaker": 0.3
}
}
}
。。。。。。。。。。。。。。。注意上面的查询要是字符类型 field中都是字符类型,int 类型就是int 类型,不能再field 包含多个类型