笔记二十一:单字符串多字段查询:Dis Max Query

单字符串查询

  • 单字符串查询
    • Google 只提供一个输入框,查询相关的多个字段
    • 支持按照价格,时间等进行过虑

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
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "title": "Brown fox"
          }
        },
        {
          "match": {
            "body": "Brown fox"
          }
        }
      ]
    }
  }
}

算分过程

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

结果

"hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.90425634,
    "hits" : [
      {
        "_index" : "blogs",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.90425634, // 因为2个字段都有brown
        "_source" : {
          "title" : "Quick brown rabbits",
          "body" : "Brown rabbits are commonly seen."
        }
      },
      {
        "_index" : "blogs",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.77041256,
        "_source" : {
          "title" : "Keeping pets healthy",
          "body" : "My quick brown fox eats rabbits on a regular basis."
        }
      }
    ]
  }

ES 笔记二十:单字符串多字段查询:Dis Max Query

ES 笔记二十:单字符串多字段查询:Dis Max Query

Disjunction Max Query 查询

  • 上列中,title 和 body 相互竞争
    • 不应该将分数简单叠加,而是应该找个单个最佳匹配的字段的评分
  • Disjunction Max Query
    • 将任何与任一查询匹配的文档作为结果返回。采用字段上最匹配的评分返回
POST /blogs/_search
{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match": {
            "title": "Quick fox"
          }
        },
        {
          "match": {
            "body": "Quick fox"
          }
        }
      ]
    }
  }
}

ES 笔记二十:单字符串多字段查询:Dis Max Query

最佳字段查询调优

  • 有一些情况下,同时匹配title 和 body 字段的文档比只与一个字段匹配的文档的相关度更高
  • disjunction max query查询指挥简单的使用单个最佳匹配语句的评分_scoce 作为整体评分

通过Tie Breaker 参数调整

  • 获得最佳匹配语句的评分
  • 其他匹配语句的评分 与 tie_breaker 相乘
  • 对以上评分求和并规范化
    • Tie Breanker 是一个介于0-1之间的浮点数。0 代表使用最佳匹配l;1代表所有语句同等重要。
      POST blogs/_search
      {
      "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Quick pets" }},
                { "match": { "body":  "Quick pets" }}
            ],
            "tie_breaker": 0.2
        }
      }
      }
es
本作品采用《CC 协议》,转载必须注明作者和本文链接
快乐就是解决一个又一个的问题!
CrazyZard
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!