美文网首页
4.5-单字符串多字段查询-DisMaxQuery

4.5-单字符串多字段查询-DisMaxQuery

作者: 落日彼岸 | 来源:发表于2020-04-01 19:39 被阅读0次

单字符串查询的实例

  • 博客标题

    • ⽂档 1 中出现 “Brown”
  • 博客内容

    • ⽂档 1 中出现了 “Brown”

    • “Brown fox” 在⽂档 2 中全部出现,并且保持和查询⼀致的顺序(⽬测相关性最⾼)

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."
}

POST /blogs/_search
{
    "explain": true, 
    "query": {
        "bool": {
            "should": [
                { "match": { "title": "Brown fox" }},
                { "match": { "body":  "Brown fox" }}
            ]
        }
    }
}

算分过程

  • 查询 should 语句中的两个查询

  • 加和两个查询的评分

  • 乘以匹配语句的总数

  • 除以所有语句的总数

查询结果及分析

查询结果

Disjunction Max Query 查询

  • 上例中,title 和 body 相互竞争

    • 不应该将分数简单叠加,⽽是应该找到单个最佳匹配的字段的评分
  • Disjunction Max Query

    • 将任何与任⼀查询匹配的⽂档作为结果返回。采⽤字段上最匹配的评分最终评分返回

Disjunction Max Query 查询

POST blogs/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Brown fox" }},
                { "match": { "body":  "Brown fox" }}
            ]
        }
    }
}
image.png

最佳字段查询调优

POST blogs/_search
{
    "explain": true, 
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Quick pets" }},
                { "match": { "body":  "Quick pets" }}
            ]
        }
    }
}
image.png
  • 有⼀些情况下,同时匹配 title 和 body 字段的 ⽂档⽐只与⼀个字段匹配的⽂档的相关度更⾼
  • 但 disjunction max query 查询只会简单地使 ⽤单个最佳匹配语句的评分 _score 作为整体评分。怎么办?

通过 Tie Breaker 参数调整

POST blogs/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Quick pets" }},
                { "match": { "body":  "Quick pets" }}
            ],
            "tie_breaker": 0.2
        }
    }
}
image.png
  • 获得最佳匹配语句的评分 _score 。

  • 将其他匹配语句的评分与 tie_breaker 相乘

  • 对以上评分求和并规范化

Tier Breaker 是⼀个介于 0-1 之间的浮点数。0 代表使⽤最佳匹配;1 代表所有语句同等重要。

本节知识点回顾

  • 使⽤ bool 查询实现单字符串多字段查询

  • 单字符串多字段查询时,如何在多个字段上进⾏算分

  • 复合查询:Disjunction Max Query

  • 将评分最⾼的字段评分作为结果返回,满⾜两个字段是竞争关系的场景

  • 对最佳字段查询进⾏调优:通过控制 Tie Breaker 参数,引⼊其他字段对算分的⼀些影响

课程demo

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."
}

POST /blogs/_search
{
    "explain": true, 
    "query": {
        "bool": {
            "should": [
                { "match": { "title": "Brown fox" }},
                { "match": { "body":  "Brown fox" }}
            ]
        }
    }
}

POST blogs/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Brown fox" }},
                { "match": { "body":  "Brown fox" }}
            ]
        }
    }
}


POST blogs/_search
{
    //"explain": true, 
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Quick pets" }},
                { "match": { "body":  "Quick pets" }}
            ]
        }
    }
}


POST blogs/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Quick pets" }},
                { "match": { "body":  "Quick pets" }}
            ],
            "tie_breaker": 0.2
        }
    }
}

相关阅读

相关文章

  • 4.5-单字符串多字段查询-DisMaxQuery

    单字符串查询的实例 博客标题⽂档 1 中出现 “Brown” 博客内容⽂档 1 中出现了 “Brown”“Brow...

  • 2-1,数据库的单表查询,多表查询

    单表查询(select) 不加条件的查询: 1,查询特定字段 语法 select<字段1,字段2,......>f...

  • 20220722总结

    多对多查询,出现重复,影响分页,建议同张表创建字段 1.针对单表版本限制方案 使用单表添加字段,添加是否开启ios...

  • MySQL查询数据

    [toc] 单表查询: 查询条件列表 查询所有字段 查询指定字段: 查询指定记录: 带 in关键字的查询 如果us...

  • 查询数据

    一、单表查询1,查询所有字段SELECT * FROM tb_name;2,查询指定字段SELECT id,nam...

  • 查询数据

    一、单表查询 1.查询所有的字段 a.SELECT 字段1,字段2,字段3... FROM 表名 b.SELECT...

  • SQL之更删改查

    查询 单表查询 查询所有字段 查询指定字段 WHERE条件查询 下面的运算符可在 WHERE 子句中使用: 去重复...

  • orm查询操作

    单表查询操作 外键的跨表查询 正向查询(在有外键字段的表向没有的表查询) 反向查询(没有外键的字段向有外键字段的表...

  • 07-mongodb操作实例

    查询 1.多条件查询Article 查询Article中title字段中含有字符串“哈哈”,或者tags中含有“哈...

  • java mysql jdbcTemplate 使用

    1.查询数量、ID int类型数据 2.查询单条数据单个字段信息 3.查询单条数据 4.多条数据查询

网友评论

      本文标题:4.5-单字符串多字段查询-DisMaxQuery

      本文链接:https://www.haomeiwen.com/subject/odsbuhtx.html