ElasticSearch | 单字符串 | 多字段 | Disjunction Max Query

bool 查询 | should 子句 | 举例分析

数据准备 | blogs
PUT /blogs/_doc/1
{
    "title": "Quick brown rabbits",
    "body":  "Brown rabbits are commonly seen."
}

PUT /blogs/_doc/2
{
    "title": "Keeping pets healthy",
    "body":  "My quick brown fox eats rabbits on a regular basis."
}
bool 查询 | should 子句
  • id 为 1 的文档的算分高;
  • 因为 id 为 1 的文档在 title 和 body 字段中都获得算分,id 为 2 的文档只在 body 字段中获得算分;
  • 尽管 id 为 2 的文档从语义上的匹配度是更高的;
POST /blogs/_search
{
    "query": {
        "bool": {
            "should": [
                { "match": { "title": "Brown fox" }},
                { "match": { "body":  "Brown fox" }}
            ]
        }
    }
}

bool 查询 | should 子句 | 算分过程

  • 查询 should 语句中的两个查询;
  • 加和两个查询的评分;
  • 乘以匹配语句的总数;
  • 除以所有语句的总和;

Disjunction Max Query 查询

  • 在上例中,title 和 body 相互竞争,不应该将分数简单叠加,而是应该找到单个最佳匹配的字段的评分;
  • Disjunction Max Query 将某个字段上算分最高的算分作为文档的算分;

Disjunction Max Query 查询 | 举例

搜索关键词 "Brown fox"
  • id 为 2 的文档的 body 字段完全匹配到了关键词 "Brown fox",所以其算分最高;
POST /blogs/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Brown fox" }},
                { "match": { "body":  "Brown fox" }}
            ]
        }
    }
}
搜索关键词 "Quick pets"
  • 虽然 id 为 2 的文档的两个字段分别匹配到了关键词中的一个,但是每个字段的算分和只有一个字段匹配到关键词中的一个的 id 为 1 的文档是一样的,所以两个文档的算分是一样的;
POST blogs/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Quick pets" }},
                { "match": { "body":  "Quick pets" }}
            ]
        }
    }
}
搜索关键词 "Quick pets" | tie_breaker
  • tie_breaker 是一个介于 0-1 之间的浮点数,0 代表使用最佳匹配,1 代表所有语句同等重要;
  • tie_breaker 的作用是:除了取最高分以外,还会考虑其他字段的分数,具体算法是,其余字段的算分 * tie_breaker,再加到最高分字段的算分上去;
POST blogs/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Quick pets" }},
                { "match": { "body":  "Quick pets" }}
            ],
            "tie_breaker": 0.2
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值