前言

  • 本文对 Elasticsearch 7.17 适用
  • Elasticsearch 权威指南

    如果没有 must 语句,那么至少需要能够匹配其中的一条 should 语句。
    但,如果存在至少一条 must 语句,则对 should 语句的匹配没有要求。
  • 以 qbit 当前认知来说,should 有两个功能

    功能一:当 must 存在时,给同时匹配到的文档加分
    功能二:当 must 不存在时,要求只能能匹配一个 should 子句,相当于'与或非'逻辑中的'或'
  • 本文想试验,should 加分加多少,怎样控制加多少

试验

  • 创建索引
PUT my_index
{
  "mappings": {
    "dynamic": false,
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "abstract": {
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}
  • 写入测试数据
POST my_index/_bulk
{ "index": { "_id": "1" } }
{ "title": "地球大数据缘起和进展", "abstract": "进入信息时代以来,数据总量呈爆炸式增长,数据的类型、结构、维度也更加复杂多样,远远超出了传统数据库的管理和处理能力,逐渐向“大数据方向转变.大数据是用于描述超出常规处理能力的数据集术语,其内涵不仅包含海量的数据本身,也包含对这些数据集的存储、处理与分析方法.当前,大数据已经成为国家信息主权的体现,并已在人类社会发展中发挥重要作用" }
  • must 查询 abstract,得到 1.47
GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "abstract": {
              "query": "大数据"
            }
          }
        }
      ]
    }
  },
  "_source": [ "title" ]
}
  • must 查询 title,得到 0.86
  • must 查询 abstractshould 查询 title,得到 2.33 分(1.47 + 0.86 = 2.33
GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "abstract": {
              "query": "大数据"
            }
          }
        }
      ],
      "should": [
        {
          "match": {
            "title": {
              "query": "大数据"
            }
          }
        }
      ]
    }
  },
  "_source": [
    "title"
  ]
}
  • should 引入 boost,得到 3.2 分(1.47 + 0.86 × 2 ≈ 3.2)
GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "abstract": {
              "query": "大数据"
            }
          }
        }
      ],
      "should": [
        {
          "match": {
            "title": {
              "query": "大数据",
              "boost": 2
            }
          }
        }
      ]
    }
  },
  "_source": [
    "title"
  ]
}

小结

  • should 得分只会与 must 得分简单相加,要调控加分可以用 should 里面查询语句 的 boost 实现
本文出自 qbit snap

qbit
268 声望279 粉丝