SpringCloud系列(十六)[分布式搜索引擎篇] - DSL 查询及相关性算分的学习 (部分)

news2024/11/22 11:10:19

在SpringCloud系列(十五)[分布式搜索引擎篇] - 结合实际应用场景学习并使用 RestClient 客户端 API这篇文章中我们已经对 RestClient 有了初步的了解, 并且已经将一些数据进行了存储, 但是这并不是我们学习 ElasticSearch 的目的, ElasticSearch 最擅长的还是对数据的搜索及分析, 因此本篇博客将对 ElasticSearch 的数据搜索功能进行演示.

DSL 查询及相关性算分的学习

  • ①DSL 对文档的查询
    • 1.1 查询所有
    • 1.2 全文检索查询
    • 1.3 精准查询
    • 1.4 地理坐标查询
    • 1.5 复合查询
      • 1.5.1 相关性算分
      • 1.5.2 语法
      • 1.5.3 布尔查询
  • ② 搜索结果的处理
  • ③ RestClient 查询文档
  • ④ 案例

①DSL 对文档的查询

常见查询类型:

  • 查询所有: 查询所有数据, 如 match_all;
  • 全文检索查询(full text): 主要利用分词器对用户的输入内容进行分词, 然后去倒排索引库中进行匹配查询, 如 match_query / multi_match_query;
  • 精确查询: 根据精确词条查询数据, 一般是用来查询日期 / 数值等类型的字段, 如 ids / range / term;
  • 地理查询(geo): 通常根据经纬度进行查询, 如 geo_distance / geo_bounding_box;
  • 复合查询(compound): 可以将上面的几种查询类型进行组合, 合并查询条件, 如 bool / function_score.

下面所有的查询语法基本如出一辙:

GET /索引库名/_search
{
  "query": {
    "查询类型": {
      "查询条件": "条件值"
    }
  }
}

1.1 查询所有

GET /hotel/_search
{
  "query": {
    "match_all": {}
  }
}

因为是查询所有的数据, 所以没有查询条件, 查询类型为 match_all, 查询所有一般用不到, 使用场景也就仅限于测试的时候使用;

1.2 全文检索查询

在这里插入图片描述

全文检索查询的使用场景比较多, 我们生活中也经常使用, 如在淘宝上买鞋子买衣服等, 都是搜索某一个牌子的名称或者是物品的名称, 也就是说需要拿着词条去索引库中匹配, 因此参与搜索的字段也必须是可分词的 text 类型的字段; 通过这个例子可以得到全文检索查询的基本流程如下:

  • 对搜索的内容进行分词得到词条;
  • 根据词条去倒排索引库中匹配, 得到文档 id;
  • 根据文档 id 找到文档, 然后返回到页面中.

关于全文检索的查询主要包括 match / multi_match 两种, 一个是单字段查询, 一个是多字段查询, 多字段查询的意思就是任意一个字段符合条件就满足查询条件. 示例如下:

match:

GET /hotel/_search
{
  "query": {
    "match": {
      "all":"喜来登"
    }
  }
}

在这里插入图片描述

multi_match:

GET /hotel/_search
{
  "query": {
    "multi_match": {
      "query":"上海喜来登",
      "fields": ["name","business"]
    }
  }
}

在这里插入图片描述
这里需要注意: multi_match 是根据多个字段进行查询, 参与的字段越多, 查询的效率就会越低, 因此一般使用 match 查询即可.

1.3 精准查询

精准查询的使用场景也是挺多的, 如查询某个日期范围内的数据, 或者是精确查询某一个地区的数据;

  • term: 根据词条精确值进行查询, 如查询北京地区的喜来登酒店, 筛选出的数据就只有北京地区的喜来登;
  • range: 根据值得范围进行查询, 如查询 500 元以上的酒店数据.

term 查询:

GET /hotel/_search
{
  "query": {
    "term": {
      "city": {
        "value": "上海"
      }
    }
  }
}

在这里插入图片描述
这里需要注意: 词条必须是精确的, 不能是多个词语组成的短语, 如果是北京上海, 是搜索不到结果的, 如下所示:
在这里插入图片描述

range 查询:

GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "gte": "2000",
        "lte":"5000"
      }
    }
  }
}

查询到的是 2000 元到 5000 元价格酒店;
在这里插入图片描述

1.4 地理坐标查询


出去游玩打车或者订酒店经常需要进行定位附近的快车及酒店, 地理坐标的查询就能实现这样的功能, 一种是根据地理坐标的经纬度进行查询, 如根据矩形范围进行查询:

GET /hotel/_search
{
  "query": {
    "geo_bounding_box": {
      "FIELD": {
        "top_left": { 
          "lat": 31.35786,
          "lon": 121.59324
        },
        "bottom_right": {
          "lat": 31.35493,
          "lon": 121.59838
        }
      }
    }
  }
}

这里首先要确定左上角的点的坐标及右下角的点的坐标, 比较复杂, 但是有一种简单的方式, 可以根据距离进行查询, 查询到指定中心点小于某个距离值的所有数据; 也就是说以我现在的位置为中心, 距离我某个距离的圆弧内都符合条件, 如下所示:

GET /hotel/_search
{
  "query": {
    "geo_distance": {
      "distance": "5km",
      "location": "39.94076,116.46099"
    }
  }
}

这里我查询的是以三里屯为中心点, 距离三里屯 5 km 所有的数据:
在这里插入图片描述

1.5 复合查询

  复合查询可以将其简单的查询组合起来, 实现更加复杂的搜索逻辑, 主要有以下两种:

  • function score: 算分函数查询, 通过控制文档相关性算分, 来控制文档的排名;
  • bool query: 布尔查询, 主要利用逻辑关系组合多个查询, 实现复杂的搜索逻辑.

1.5.1 相关性算分

  当我们使用 match 进行查询时, 文档结果会根据与搜索词条的关联度进行打分, 返回的结果也会按照分值的降序进行排序;   ElasticSearch 早起使用的打分算法是 TF-IDF 算法, 关于算法的公式如下:
在这里插入图片描述
但是 TF-IDF 算法有一个缺陷: 当词条的频率越来越高的时候, 文档的得分也会越来越高, 单个词条对文档的影响较大. 针对这样的问题, ElasticSearch 将打分算法改进为 BM25, BM25 会让单个词条的算分有一个上限, 曲线更加的平滑.公式如下:
在这里插入图片描述

1.5.2 语法

GET /hotel/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "all": "北京"
        }
      },
      "functions": [
        {
          "filter": {
            "term": {
              "id": "1"
            }
          },
          "weight": 10
        }
      ],
      "boost_mode": "multiply"
    }
  }
}

在这里插入图片描述


如图所示, 可以看得出分数值是降序的, 具体的语法说明如下:
在这里插入图片描述
具体流程如下:

  • 根据原始条件查询搜索文档, 并且计算相关性算分, 也就是 query score (原始算分);
  • 根据过滤条件过滤掉不符合条件的文档;
  • 基于算分函数运算得到函数得分 (function score);
  • 将原始算分 (query score) 和 函数算分 (function score) 基于运算模式做运算, 得到相关性算分的最终结果.

例如: 给北京的喜来登排名靠前, 如下:
原始查询, 得分为 2.6944847;
在这里插入图片描述
添加算分函数后, 得分为 4.6944847, 如下:
在这里插入图片描述

1.5.3 布尔查询

在这里插入图片描述

  布尔查询的使用场景还是挺多的, 如上图在淘宝上搜索 阿迪达斯, 我们可以进行选择筛选, 可以根据鞋码 / 性别等; 因为每一个字段都是不同的, 查询的条件或者方式也不一样, 因此肯定是多个不同的查询, 那么要组合这些查询就用到了布尔查询;
 总之, 布尔查询也是一个或者多个字句的组合, 每一个字句都是一个子查询, 组合方式有:

  • must: 必须匹配每个子查询, 类似 “与”;
  • should: 选择性匹配子查询, 类似 “或”;
  • must_not: 必须不匹配, 不参与算分, 类似 “非”;
  • filter: 必须匹配, 不参与算分.

例子:

GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {"city": "北京"}}
      ],
      "should": [
        {"term": {"brand":"希尔顿"}},
        {"term": {"brand":"喜来登"}}
      ],
      "must_not": [
        {"range": {"price": {"lte": 1200} }}
      ],
      "filter": [
        {"range": {
          "score": {
            "gte": 47
          }
        }},
        {"geo_distance": {
          "distance": "50km",
          "location": {
            "lat": 39.91979,
            "lon": 116.41804
          }
        }}
      ]
    }
  }
}

代码解读:
在这里插入图片描述


这里需要注意的是: 搜索过程中, 参与打字的字段越多, 查询的性能就会越差劲, 因此多条件查询时, 需要注意以下两点:

  • 搜索框的关键字搜索是全文检索查询, 使用 must 查询参与算分;
  • 其他的过滤条件采用 filter 查询, 不参与算分.

② 搜索结果的处理

③ RestClient 查询文档

④ 案例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/766775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java8之Stream流

目录 简介 特点 Stream操作步骤 创建 中间操作 筛选与切片 filter(Predicate p) distinct() limit(long maxSize) skip(long n) 映射 map(Function f) flatMap(Function f) 排序 自然排序 定制排序 终止操作 匹配与查找 归约 收集 好处 不足 简介 在编写…

css基本样式的使用

1、高度和宽度 .c1{height: 300px;width: 500px; }注意事项: 宽度,支持百分比行内标签,默认无效块级标签,默认有效(即使右侧空白,也不给你占用) 块级和行内标签 css样式 标签: di…

echarts 地图点击常见问题

echats 散点图不支持缩放 echarts 地图点击激活label如何去除 高德loca 1.4版本热力图报错 绘制的颜色区间是 0 --1 高德地图销毁不生效 自己傻逼,每次没有清空数组导致叠加数据,约点数据越多。 为何用高德地图district.search查询不到别的省数据&…

【SpringBoot】SpringBoot的创建和运行

1.什么是SpringBoot? Spring 的诞⽣是为了简化 Java 程序的开发的,⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发 的。 Spring Boot是由Pivotal团队提供的基于Spring的框架,该框架使用了特定的方式来进行配置,从而使开发…

洗鞋小程序开发

上门洗鞋小程序为用户提供了便捷、高效的鞋子洗护服务。通过手机即可预约上门取送鞋子,省时省力,让鞋子焕然一新。下面我们来看看这个小程序的具体功能介绍。 1. 预约取送服务:用户可以在上门洗鞋小程序中选择合适的时间和地点,预…

访问学者面试申请如何应对?

作为一个学者面试申请者,面对这一重要机会,我们需要认真准备并采取适当的应对策略。下面知识人网小编将提供一些建议,帮助你在面试中取得良好的表现。 首先,在准备阶段,你应该研究并了解申请机构的背景和研究方向。了解…

阻止冒泡 大盒子套小盒子 点击大盒子跳转页面 小盒子不跳转

比如论坛点赞功能 点击这篇帖子跳到论坛详情页面,但是点赞不跳转 <view click.stop"onSmallBoxClick"><!-- 点赞 --> </view>methods: {onSmallBoxClick() {// 点赞逻辑 } } 大盒子 帖子div <view click"g…

pdf合并一页怎么合并?这几种合并方法看看

pdf合并一页怎么合并&#xff1f;PDF文件是一种非常常见的文件格式&#xff0c;它可以在不同的操作系统和设备之间方便地进行共享。有时候&#xff0c;我们需要将多个PDF文件合并成一个文件。例如&#xff0c;当我们需要将多个文档合并成一个大文档时&#xff0c;或者我们需要将…

Redis数据类型与常用命令

文章目录 前言一、Redis数据类型1. Redis数据类型简介2. Redis数据类型特点 二、Redis常用命令1. 字符串string 操作命令2. 哈希hash 操作命令3. 列表list 操作命令4. 集合set操作命令5. 有序集合 sorted set 操作命令6. 通用命令 总结 前言 为了巩固所学的知识&#xff0c;作…

TRT3-trt-basic - 6 Int8的量化

int8量化是利用int8乘法替换float32乘法实现性能加速的一种方法 对于常规模型有&#xff1a;y kx b&#xff0c;此时x、k、b都是float32, 对于kx的计算使用float32的乘法 对于int8模型有&#xff1a;y tofp32(toint8(k) * toint8(x)) b&#xff0c;其中int8 * int8结果为in…

win7,win10下删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\报错

在调试虚拟网卡驱动时&#xff0c;由于修改错误&#xff0c;导致枚举顺序错乱&#xff0c;因此通过删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\WINTUN下的所有项&#xff0c;即可&#xff0c;win10可用。 1、下载PStools&#xff1a; http://technet.microsoft.c…

130、仿真-基于51单片机智能窗户温湿度电机控制仿真设计(Proteus仿真+程序+配套资料等)

方案选择 单片机的选择 方案一&#xff1a;STM32系列单片机控制&#xff0c;该型号单片机为LQFP44封装&#xff0c;内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ&#xff0c;在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节…

算法(1):斐波那契数列模型

目录 &#x1f981;三步问题 &#x1f349;题目解析 &#x1f349;算法原理 &#x1f352;状态表示 &#x1f352;状态转移方程 &#x1f352;初始化 &#x1f352;填表顺序、返回值 &#x1f349;代码编写 &#x1f981;使用最小花费爬楼梯 &#x1f349;题目解析 …

为什么选择STM32才是明智之选?

在电子工程领域&#xff0c;我们强调适用性&#xff0c;性能并非最重要&#xff0c;甚至不是首要考虑因素。选择合适的微控制器&#xff08;MCU&#xff09;根据设计需求而异&#xff0c;常规做法是在保证功能满足的前提下&#xff0c;选择稳定可靠且经济实惠的器件。而对于那些…

前端转换bigInt,axios拦截器失效

前端转换bigInt&#xff0c;axios拦截器失效 关于bigInt的使用切换雪花ID解决精度丢失问题进度丢失&#xff0c;前端不支持bigInt解决问题 拦截器失效验证及解决 关于bigInt的使用 这篇文章算是使用中的小笔记吧&#xff0c;主要是我自己搜索没找到直接的方法&#x1f613;&am…

SSH隧道功能

随着互联网的普及和发展&#xff0c;越来越多的企业需要申请公网IP地址。&#xff08;公网IP地址是指可以在互联网上直接访问的P地址&#xff0c;可以用于建立网站、远程办公、视频监控等应用。&#xff09; 而公网IP费用较高&#xff0c;笔者在某搜索软件上搜了一下&#xff…

科研创新服务平台性能分析案例

前言 信息中心老师反应&#xff0c;用户反馈科研创新服务器平台有访问慢的情况&#xff0c;需要通过流量分析系统来了解系统的运行情况&#xff0c;此报告专门针对系统的性能数据做了分析。 信息中心已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和历史原…

笑谈测试员躺着也中枪的那些事

在近9年的软件测试职业生涯中&#xff0c;多少遇到一些奇奇怪怪的事。而最悲催的莫过于那些自己躺着也中枪的事&#xff0c;如果处理不好惹火烧身&#xff0c;直接被“毙掉”也不无可能。 下面就摆摆那些事儿(其中可能因人老记忆衰退严重&#xff0c;与事实间有一定的夸大成分&…

【字节流】复制文本文件

字节流复制文本文件 1.需求&#xff1a; 把“D:\\浏览器下载\\窗里窗外.txt”复制到模块目录下的“窗里窗外.txt” 2.分析&#xff1a; ①复制文本文件&#xff0c;其实就把文本文件的内容从一个文件中读取出来&#xff08;数据源&#xff09;&#xff0c;然后写入另一个文件…

jenkins手把手教你从入门到放弃03-安装Jenkins时web界面出现该jenkins实例似乎已离线

简介 很久没有安装jenkins了&#xff0c;因为之前用的的服务器一直正常使用&#xff0c;令人郁闷的是&#xff0c;之前用jenkins一直没出过这个问题。 令人更郁闷的是&#xff0c;我尝试了好多个历史版本和最新版本&#xff0c;甚至从之前的服务器把jenkins在跑的程序打包copy…