Elasticsearch实战(六)---高级搜索 boost控制权重实现搜索结果排名

2023-11-13

Elasticsearch实战- Boost 搜索结果排名

1.Boost权重控制

基于文章 Elasticsearch实战(二)—高级查询语法使用 前面的文章,我们已经学习了ES基本使用及高级语法

现在问一个问题, 百度如何实现 我广告优先展示呢?或者淘宝页面中我搜索一个 手机, 淘宝电商搜索是如何排序的?手机有很多属性,比如手机的销售量,手机广告商的投钱金额,手机销售的评价星级,手机的单价,手机剩余库存等等,在上述排序元素中,是如何排序的?我来告诉你

  1. 广告商投钱金额,投放广告钱越多,越容易搜索,排名越靠前
  2. 手机的销量,销量越高,越容易搜索,排名越靠前
  3. 手机的评级星级,评价好评越多,排名越靠前
  4. 然后再是手机的单价,单价越接近手机销售平均值,排名越靠前,商品价格 高价/低价都不推荐,平均价反而容易被大家认可
  5. 最后才是库存及发货地,库存量剩余多少,发货地哪里等等展示排名
1.1 准备数据

empId:员工id, salary 表示薪资, deptName:部门, address:地址

POST /testboost/_bulk
{"index":{"_id": 1}}
{"empId" : "111","name" : "员工1","age" : 20,"sex" : "男","mobile" : "19000001111","salary":1333,"deptName" : "技术部","address" : "湖北省武汉市洪山区光谷大厦"}
{"index":{"_id": 2}}
{"empId" : "222","name" : "员工2","age" : 25,"sex" : "男","mobile" : "19000002222","salary":15963,"deptName" : "销售部","address" : "湖北省武汉市江汉路"}
{"index":{"_id": 3}}
{ "empId" : "333","name" : "员工3","age" : 30,"sex" : "男","mobile" : "19000003333","salary":20000,"deptName" : "技术部","address" : "湖北省武汉市经济开发区"}
{"index":{"_id": 4}}
{"empId" : "444","name" : "员工4","age" : 20,"sex" : "女","mobile" : "19000004444","salary":5600,"deptName" : "销售部","address" : "湖北省武汉市沌口开发区"}
{"index":{"_id": 5}}
{ "empId" : "555","name" : "员工5","age" : 20,"sex" : "男","mobile" : "19000005555","salary":9665,"deptName" : "测试部","address" : "湖北省武汉市东湖隧道"}
{"index":{"_id": 6}}
{"empId" : "666","name" : "员工6","age" : 30,"sex" : "女","mobile" : "19000006666","salary":30000,"deptName" : "技术部","address" : "湖北省武汉市江汉路"}
{"index":{"_id": 7}}
{"empId" : "777","name" : "员工7","age" : 60,"sex" : "女","mobile" : "19000007777","salary":52130,"deptName" : "测试部","address" : "湖北省黄冈市边城区"}
{"index":{"_id": 8}}
{"empId" : "888","name" : "员工8","age" : 19,"sex" : "女","mobile" : "19000008888","salary":60000,"deptName" : "技术部","address" : "湖北省武汉市江汉大学"}
{"index":{"_id": 9}}
{"empId" : "999","name" : "员工9","age" : 40,"sex" : "男","mobile" : "19000009999","salary":23000,"deptName" : "销售部","address" : "河南省郑州市郑州大学"}
{"index":{"_id": 10}}
{"empId" : "101010","name" : "张湖北","age" : 35,"sex" : "男","mobile" : "19000001010","salary":18000,"deptName" : "测试部","address" : "湖北省武汉市东湖高新"}
{"index":{"_id": 11}}
{"empId" : "111111","name" : "王河南","age" : 61,"sex" : "男","mobile" : "19000001011","salary":10000,"deptName" : "销售部","address" : "河南省开封市河南大学"}
{"index":{"_id": 12}}
{"empId" : "121212","name" : "张大学","age" : 26,"sex" : "女","mobile" : "19000001012","salary":1321,"deptName" : "测试部","address" : "河南省开封市河南大学"}
{"index":{"_id": 13}}
{"empId" : "131313","name" : "李江汉","age" : 36,"sex" : "男","mobile" : "19000001013","salary":1125,"deptName" : "销售部","address" : "河南省郑州市二七区"}
{"index":{"_id": 14}}
{"empId" : "141414","name" : "王技术","age" : 45,"sex" : "女","mobile" : "19000001014","salary":6222,"deptName" : "测试部","address" : "河南省郑州市金水区"}
{"index":{"_id": 15}}
{"empId" : "151515","name" : "张测试","age" : 18,"sex" : "男","mobile" : "19000001015","salary":20000,"deptName" : "技术部","address" : "河南省郑州高新开发区"}
1.2 默认查询

现在想找 地址:湖北省 且 技术部 或者 销售部的 人

get /testboost/_search
{
  "query":{
    "bool": {
      "must": [
        {
          "match_phrase": {
            "address": "湖北省"
          }
        },
        {
          "bool": {
            "should": [
              {
                "match_phrase": {
                  "deptName": "技术部"
                }
              },
              {
                "match_phrase": {
                  "deptName": "销售部"
                }
              }
            ]
          }
        }
      ]
    }
  }
}

可以查看查询结果 ,每个员工查询出来的结果都携带了一个分数,然后排序是默认按照分数排序的
{员工2 :score :3.2875974}
{员工8 :score : 3.2417724}
{员工3 :score : 3.1995492}
在这里插入图片描述

1.3 boost控制修改权重

现在想找 地址:湖北省 且 技术部 或者 销售部的 人 且 我想让 销售部的人 分数较大 优先展示,技术部的人后面展示,分数较小
这种场景就可以用 boost 权重来控制 , 我现在给销售部 加权 ,boost变为 5,技术部默认 boost就是1 看下分数是否改变

get /testboost/_search
{
  "query":{
    "bool": {
      "must": [
        {
          "match_phrase": {
            "address": "湖北省"
          }
        },
        {
          "bool": {
            "should": [
              {
                "match_phrase": {
                  "deptName":{
                    "query": "技术部", 
                    "boost":1
                  } 
                }
              },
              {
                "match_phrase": {
                 "deptName":{
                    "query": "销售部", 
                    "boost":5
                  } 
                }
              }
            ]
          }
        }
      ]
    }
  }
}

可以查看查询结果 ,每个员工查询出来的结果都携带了一个分数,销售部加权 后 分数较高,优先排名,技术部排名靠后
{员工2 :score :11.95731}
{员工8 :score : 11.869268}
{员工3 :score : 3.2875974}
在这里插入图片描述

2.多Shard Boost权重控制相关度不准确
  • 如果只有一个主分片,那么就不会有任何误差
  • 如果有多个主分片就会产生误差 ,上面计算的相关度分数 控制排名不一定精确

多shard分片为什么会不精确?
因为多shard分片的情况导致的,相关度计算是根据每一个分片上存储的数据进行计算的,而且倒排索引计算规则是 计算所有的文档计算TFIDF来计算权重的

  • 分片1 中 包含技术部的 有100个文档, 然后通过100个文档来计算TFIDF,因为文档多,所以权重被拉低了
  • 分片2 中 包含技术部的 有5个文档, 因为文档少,所以他的TFIDF,权重占比就很高

但是如果数据量足够多,概率性问题就会避免,就不需要考虑这个问题
如果开发测试环境中,一般通过设置 number_of_shards:1 只有一个分片来操作测试环境


至此 我们已经能够 通过 控制查询 字段的 权重 来控制搜索结果 相关度排序 处理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch实战(六)---高级搜索 boost控制权重实现搜索结果排名 的相关文章

随机推荐

  • js实现字符串排序

    规则 规则 1 英文字母从 A 到 Z 排列 不区分大小写 如 输入 Type 输出 epTy 规则 2 同一个英文字母的大小写同时存在时 按照输入顺序排列 如 输入 BabA 输出 aABb 规则 3 非英文字母的其它字符保持原来的位置
  • 29.Kubernetes(十一)-----监控(helm可视化 web图形)

    helm可视化 web图形 一 镜像 1 下载镜像 2 上传镜像到仓库 二 编写配置文件 三 安装部署 1 真机解析 2 添加用户 赋予管理权限 3 真机访问 4 访问成功 5 Token登陆 四 图形操作 1 添加仓库 编写仓库解析 添加
  • 嵌入式单片机及其相关博客及教程

    一 单片机 1 嵌入式单片机程序架构之时间片轮询法 https mp weixin qq com s F6FGDwW Rqaxzf9BYcg6yQ 2 stm32 f429 移植 littlevGL https mp weixin qq c
  • 芯片设计中的latch_闩锁效应(Latch-up)详解

    在CMOS集成电路中 闩锁效应不容忽视 这篇文章将从0开始给大家介绍闩锁效应 Latch up 以及有效抑制闩锁效应的方法 一 背景知识 1 双极结型晶体管 Bipolar Junction Transistor BJT 图1 NPN型BJ
  • 四、数据库与身份认证

    目录 安装与配置MySQL MySQL的基本使用 使用 MySQL Workbench 管理数据库 1 连接数据库 2 了解主界面的组成部分 3 创建数据库 4 创建数据表 5 向表中写入数据 SQL 的 SELECT 语句 1 语法 2
  • 视频的容器与格式

    转发自 http blog csdn net tttyd article details 6893392 1 视频容器格式简介 一般而言 视频文件的扩展名就是视频的容器名 比如 avi文件 或者 mp4文件 avi和mp4只是容器格式 好比
  • 五大开源Web服务器

    开源产品的出现不仅获得了个人用户的喜爱 众多知名企业也青睐于它 虽然开源产品数不胜数 但并不是每一个开源产品都能被广泛应用并得到大众的好评 在众多成功的开源产品中 只有少数领头羊 而其它产品只能望其项背 本文汇总了五款开源Web服务器 来看
  • STM32F103 实验 输入捕获

    目录 本文 在上一章的基础上 将介绍如下内容 输入捕获 上一篇 STM32F103 实验 PWM输出 https blog csdn net qq 40318498 article details 96475438 参考 STM32F103
  • 测试——自动化测试(Selenium工具)

    目录 一 自动化测试的概念以及分类 二 Selenium web自动化测试工具 1 自动化测试的一些前置工作 2 第一个自动化实例 3 总结 编辑 三 Selenium常用方法 定位元素的方法 元素的操作 等待 强制等待 待补充 隐式等待
  • C++学习——函数调用运算符、function类模板

    一 函数调用运算符 1 圆括号 就是函数调用的明显标记 有一个称呼叫做 函数调用运算符 2 如果我在类中重载了函数调用运算符 那么我们就可以像使用函数一样使用该类的对象了 对象 实参 class BiggerThanZero public
  • C++初探 5-1(for循环)

    目录 注 for循环 for循环的组成部分 1 表达式和语句 2 非表达式和语句 3 修改规则 for循环的使用例 阶乘的计算与存储 修改循环更新的步长 使用for循环访问字符串 递增运算符 和 递减运算符 副作用和顺序点 前缀格式和后缀格
  • NoSQL简介和兴起的原因

    NoSQL简介和兴起的原因 NoSQL数据库具有以下几个特点 1 灵活的可扩展性 2 灵活的数据模型 3 与云计算紧密融合 怎么理解横向扩展和纵向扩展 纵向扩展 传统思想 把电脑的CPU配到顶配 内存扩展 硬盘扩大 就可以让单机更高效率地处
  • 用字节数截取字符串

    昨天去参加中科软的笔试 编程题有一道是关于字符串的 用字节数来截取字符串 如果出现中文被截断了 应该丢去中文的那个字节 如 String a 中aaa国ccc 截取6个字节的字符串 即 中aaa 国 的前一部分 设计一个函数 把截到的中文的
  • 电路设计中发光二极管用作指示灯时的限流电阻如何选择

    在设计电路时经常要用到发光二极管作为指示灯 按照网上所查到的限流电阻计算方法一般得到的限流电阻阻止在几十到一百多欧姆 电源为5V或者3 3V 但是在实际使用中我们一般使用的限流电阻不会这么小 下面是限流电阻的计算公式 R VCC VF IF
  • 表格单元格td设置宽度无效的解决办法

    http zzstudy offcn com archives 11366 在做table页面时 有时对td设置的宽度是无效的 td的宽度始终有内部的内容撑开 可以设置padding 但直接设置width却无效 下面我们来具体看下这个示例
  • 如何更好的理解PFC(功率因数校正)

    功率因数补偿 在上世纪五十年代 已经针对具有感性负载的交流用电器具的电压和电流不同相 图1 从而引起的供电效率低下提出了改进方法 由于感性负载的电流滞后所加电压 由于电压和电流的相位不同使供电线路的负担加重导致供电线路效率下降 这就要求在感
  • redis面试题(转)

    转自 https blog csdn net xiaozhegaa article details 80692017 1 什么是Redis Redis本质上是一个Key Value类型的内存数据库 很像memcached 整个数据库统统加载
  • CSerialPort教程4.3.x (5) - CSerialPort在cmake中的使用

    CSerialPort教程4 3 x 5 CSerialPort在cmake中的使用 环境 系统 windows 10 64位 QT 5 12 9 5 9及以上版本支持cmake构建 MFC vs2008 前言 CSerialPort项目是
  • Vsftp安装与配置

    在linux环境下 使用最多的FTP服务端软件就是Vsftpd 系统用户模式虽然可以控制访问 但是如果用户过多 就会影响服务器系统的管理 对服务器安全造成威胁 而且我们需要的仅仅是可以使用搭建在服务器的FTP服务而已 那么就需要我们设置虚拟
  • Elasticsearch实战(六)---高级搜索 boost控制权重实现搜索结果排名

    Elasticsearch实战 Boost 搜索结果排名 文章目录 Elasticsearch实战 Boost 搜索结果排名 1 Boost权重控制 1 1 准备数据 1 2 默认查询 1 3 boost控制修改权重 2 多Shard Bo