Elasticsearch 2025/3/7

高性能分布式搜索引擎。

数据库模糊搜索比较慢,但用搜索引擎快多了。

下面是一些搜索引擎排名

Lucene是一个Java语言的搜索引擎类库(一个工具包),apache公司的顶级项目。

优势:易扩展、高性能(基于倒排索引)

elasticsearch优势:

支持分布式,可水平扩展

提供Restful接口,可被任何语言调用

elasticsearch随着技术发展越来越完善,已经不是一个孤立的技术了,有一套完整的技术栈,简称ELK(kibana、Logstash、Beats),被广泛应用在日志数据分析、实时监控等领域。

安装ES

推荐Docker命令一键安装。

安装Kibana

一个图形界面的工具,会帮助我们连接ES,提供图形化的操作,还能自动补全。

推荐Docker命令一键安装。

Kibana提供了一个工具Dev tool,它可以帮助我们向ES发送HTTP请求,而且自带提示!!!

倒排索引

传统MySQL关系数据库只会给文档建立id索引。

而elasticsearch采用倒排索引:不仅会给文档建立id索引,还会给拆开的词条建立索引。

  • 文档:每条数据就是一个文档
  • 词条:文档按照语义分成的词语

会给词条建一个索引,将来根据词条来检索速度会非常快。

以下图为例,其实我们搜了两次,第一次拿词条来词条列表找,第二次拿着找到的文档id到文档列表里找文档。而传统关系数据库,只能全表扫描。

正向索引先去找文档,看文档里是否包含词条。

倒排索引先去找词条,得到文档id,再去找文档。(要经历两次检索)

IK分词器

英文分词很简单,因为单词间有空格。仲文分词必须按语义进行分析。

把这个插件(ik)放到插件目录里。

analyzer可以中文分词的:ik_smart、ik_max_word

IK分词器允许词典扩展。

ES核心概念

叫索引可能会混淆,我们通常把他理解成索引库。因为MySQL里给id加的那个也叫索引。索引和数据库里的表table的概念有点接近。要保证json文档他们的结构一致、数据类型一致,叫做映射。

下图是ES和MySQL数据库一些概念的对比👇

索引库操作

Mapping映射属性

Mapping映射类似于建表

keyword不可拆分的词

索引库操作

keyword不可拆,text可拆

在elasticsearch里,不允许对索引库做修改操作(指不能对已有的索引库字段做修改,但允许添加新的字段)。

文档操作

上节课学完索引库的各种操作,相当于在MySQL里去创建表,表有了之后,我们要学着操作数据。在索引库里,我们操作的是文档。

文档CRUD

完全符合Restful风格

 

全量修改,改的话全部都要改。

增量/局部修改,修改指定的。

批量处理

一个一个文档处理效率太低,这次学习批量处理。

JavaRestClient

ES给我们提供的java客户端,JavaRestClient。

这套客户端就是帮我们向restful接口发请求的。

客户端初始化

步骤:引依赖->对SpringBoot原有默认的ES版本进行覆盖->初始化RestHighLevelClient

例:

商品表Mapping映射

上节课已经完成es的java客户端的初始化,之后的几节课我们将学习如何利用这个客户端实现索引库及文档的各种操作。

创建商品索引库首先要确定商品的Mapping映射。

索引库操作

文档操作

上节课学习es的java客户端操作索引库的各种API,并创建了一个索引库。有了索引库我们就可以向里面写入文档,进行文档操作了。

source 源

request.source请求参数里的数据直接用数据库里的。但是数据库里的和索引库的字段不完全一样,我们要怎样保证他们一样呢?

首先定义一个实体,这个索引要和索引库的mapping映射结构一致。

直接复制一份po,然后把其中不需要的属性删掉。(简单无需技术含量)

根据id查数据库,查到数据库数据转化为文档数据,用到糊涂工具包BeanUtil.copyProperties(item,ItemDoc.class)拷贝数据。

得到的文档数据放到source方法请求参数必须是JSON,用工具类JSONUtil转换

新增文档操作如上,接下来我们学习文档其他增删改查的API。

发送请求结果获取到的request对象里面是完整的Json数据

而解析结果就是获取到的request对象里的source

批处理

一次只能操作一个文档效率太低,es提供了这种批处理的restful接口,之前我们是用ADP请求的方式去调用的,这回我们学习如何利用java客户端去做批处理。

一次全查可能会爆,所以下面的例子采用分页查询。 (使用Page)

结果通过record取出,做一个判断,是否没查到任何数据(一个健壮性判断)。

没查到数据就不用往下走,直接return;查到了再往索引库里写。

参数id不是写死的,而是要改成获取到的request遍历的item.id(int型要改成String)

source里的要变成JSON,而且要用我们改好的po实体类Itemdoc,而不是item。

while用来翻页的。

DSL查询

前面已经学习了es索引库和文档的各种增删改查操作了,其中我们查询文档都是根据id查询的,但是这种查询方式并不能满足我们所有的业务场景的需求,我们实际项目中不一定是根据id搜索的,他的搜索条件往往比较复杂。这时我们就需要一种新的查询方式,ES就给我们提供了一个DSL的查询,来实现这种复杂条件的查询。

快速入门

因为是查询,所以这里是GET。

GET /索引库名/_search

match_all{}:匹配/查询所有,{}里面如果啥也没有,就是没有查询条件,那就查所有

es内部默认有限制,单次允许查询最大数据不能超过1万

gte:>= 大于等于

hits:查询命中的数据

叶子查询

全文检索查询就是之前的倒排索引查询。

精确搜索,输入的搜索条件,都是相对简单不可分割的词。

range范围,term直接比较字段值。

下面以全文检索为例:

multi_match与match类似,但multi_match允许多个字段查询。

fileds数组里可以放你想查询的(多个)字段。

上图是match匹配。

默认情况下,所有的全文检索查询都会有相关的算分score,这样就能实现匹配度越高、排名越靠前。

上面是multi_match。

因为只查询了一个name字段,所以得出的结果应该和match查询一样。

精确查询用的最多的查询就是term查询。(term不分词,适合搜不分词的字段,我们上节课的multi_match和match就自带分词。所以term查询可以用在品牌、种类等等字段上)

FIELD写字段

除了有term的,还要range带范围的。

term只能搜不可分割的那种词。

range: (上面的例子price价格范围查询)

gt 大于不能等于,gte 大于等于

lt 小于不能等于, lt 小于等于

根据id查询

复合查询

布尔查询(bool)

布尔查询可以组合一个或多个查询的子句,组合的方式就是逻辑运算,与或非。

不参与算分:通常情况下,用户输入关键字做搜索,这种情况下,我们应该给他算分。但是其他的用来做过滤筛选的,我们通常情况下,都不应该参与算分。

filter和must区别:都是与,但是filter不参与算分。

参与算分的字段越多,条件越多,计算得分时消耗的性能越多,效率会低,所以能不参与算分的,我们尽可能不参与。

语法👇

例子👇

有相关度得分的must,得分排名越高越靠前。

在must,should,must_not,filter里面都是可以添加任意多的叶子查询的。

总结:

通常像关键字的搜索(用户输入内容的搜索),都是有一个匹配度的问题的,都应该参与算分,通常放到must或should。

一些过滤条件,不参与算分,通常放到filter或must_not。

function_score

dis_max

略,这俩基于某种算法修改查询时的文档相关性算分,从而改变文档排名。

排序和分页

我们学完了各种DSL的查询方式,并且拿到查询结果了。我们还需要对查询的结果去做排序和分页。ES允许我们在指定查询条件的同时,指定一些排序和分页的参数。

下面的例子就是在查询条件得到结果的基础上,es会根据你指定的排序字段做排序。

sort是一个数组,也就是我们是可以指定多个排序字段的。如果指定多个排序字段,它会按照第一个指定的字段去做排序,以此类推。

desc 降序排序

销量降序,价格升序,下面例子

排序的功能就实现好了,接下来我们实现分页功能。

深度分页问题

es其实有限制:from+size不能超过1万条。

高亮显示

在上节课学习了对搜索结果排序和分析的功能,ES除了可以对结果做排序分页,还可以实现结果的高亮显示。那么什么是高亮显示,以及它的使用语法。

之前没有讲过,其实在倒排索引的时候,不仅仅会记录词条及包含词条的文档的id,还会去记录这个词条在文档中的位置。fields是复数形式,那么高亮字段其实是可以指定多个的。

因为要高亮,所以一定要带搜索关键字,没有关键字没法高亮,所以这里一定是用全文检索查询,用match,或者multi_match都可以的。

这样就可以给关键字加标签了,source里面不会加,因为source是源,源就是源文档。但是这个搜索结果里,和source同级的,有一个highlight,这里面可以看到加了标签!!

fields属性的标签加不加都可以,因为默认加+<em>标签。

所以你会发现我们的搜索条件query、分页条件from size、排序条件sort和高亮条件highlight他们都是同一级的。

JavaRestClient查询

在上一章学习了基于DSL语法的各种不同的查询,要想实现业务功能,最终还是要用java代码。

接下来学习基于javaRestClient的各种查询API。

快速入门

以简单的查询所有为例子。match_all

1.构建请求并发起请求👇

request.source就是对应的一整个JSON。

查询条件,里面的QueryBuilders,利用他可以得到任何你想要的查询条件。

例👇

2.解析结果👇

例👇

查询可以分成两部分:

第一部分是请求的构建和发送。三步:1.构建request对象,2.给request对象添参数(核心记住两个API,source里面有各种如query、from size、highlight、sort等,query里面构建具体的查询条件记住querybuilders里面有大量方法构建条件),3.发请求。

第二部分是结果解析。

构建查询条件

全文查询👇

match和mult_match

精确查询👇

term和range

复合查询👇

布尔查询

案例训练👇

Elasticsearch02-08.JavaRestClient查询-构建查询条件_哔哩哔哩_bilibili

总结:查询条件的构建API只需要记住一个API,querybuilders。

排序和分页

上节课我们学了如何用java的客户端构建复杂的查询条件,这节课我们学了如何用java的客户端实现排序和分页。

例👇

高亮显示

关键字做高亮处理。

例👇

为了使代码简化,解析结果本来是很长的一段,被手动封装成方法了,方便看。

但是允许结果却没有高亮,为什么呢?

这是因为被封装的方法写的是getsource来取出结果,而getsource是源,不可能被修改。

所以我们不能去source里的结果,而是应该取和source同级的高亮的结果。

这里重新写一下高亮解析。我们的source是不带高亮结果的,如果要取高亮,必须用source同级的highlight。

需要注意的是,我们取出高亮结果又可能是fragments数组,这个数组里可能有多个字符串,要对他做一个拼接。

数据聚合

目前为止,我们已经学完了es的数据存储和搜索的各种功能,es不仅仅可以做数据的存储和搜索,还可以做海量数据的分析及运算。这种数据的分析和运算的功能,就成为数据聚合。

其实聚合就是对文档数据的统计分析和运算。

之前我们学习关系型数据库时,如MySQL,就提供了一些聚合函数(如求平均值的AVG函数、求和SUM、计数count)。这些聚合函数起作用就是对数据库里的数据进行统计分析和运算。

桶聚合的分组就类似MySQL关系数据库里面的group by

DSL聚合

 例👇

+条件

RestClient聚合

用java客户端实现聚合功能。

例👇

然后解析结果👇

例👇

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索AI对冲基金:开源自动化交易系统的革新之路

在量化交易领域,人工智能技术的应用正悄然改变传统对冲基金的运作模式。GitHub上的开源项目ai-hedge-fund为开发者和金融从业者提供了一个独特的实践平台。该项目通过多智能体系统架构,整合市场数据分析、量化策略生成、风险管理和投资组合优化等核心功能,实现了从数据采集到…

prompt大师高效提示词解析

Prompt大师李继刚高效提示词示例解析 一、「汉语新解」提示词 核心结构 采用Lisp语言框架嵌套中文语义&#xff0c;通过(defun 新汉语老师 ()...)定义角色风格&#xff08;融合奥斯卡王尔德、鲁迅的批判性语言&#xff09;&#xff0c;用(隐喻 (一针见血...))构建解释逻辑链。…

【GPT入门】第8课 大语言模型的自洽性

【GPT入门】第8课 大语言模型的自洽性 1.自洽性概念2.代码&#xff08;观察执行结果&#xff09;3.自洽性核心思想 1.自洽性概念 大模型的自洽性&#xff08;self - consistency&#xff09;是指在推理阶段&#xff0c;大模型通过生成多个答案并选择出现频率最高的那个&#x…

[动手学习深度学习]12.权重衰退

1.介绍 权重衰退是常见的处理过拟合的方法 控制模型容量方法 把模型控制的比较小&#xff0c;即里面参数比较少使参数选择范围小 约束就是正则项 每个特征的权重都大会导致模型复杂&#xff0c;从而导致过拟合。 控制权重矩阵范数可以使得减少一些特征的权重&#xff0c;甚至…

RabbitMq--消息可靠性

12.消息可靠性 1.消息丢失的情况 生产者向消息代理传递消息的过程中&#xff0c;消息丢失了消息代理&#xff08; RabbitMQ &#xff09;把消息弄丢了消费者把消息弄丢了 那怎么保证消息的可靠性呢&#xff0c;我们可以从消息丢失的情况入手——从生产者、消息代理&#xff0…

2019年蓝桥杯第十届CC++大学B组真题及代码

目录 1A&#xff1a;组队&#xff08;填空5分_手算&#xff09; 2B&#xff1a;年号字符&#xff08;填空5分_进制&#xff09; 3C&#xff1a;数列求值&#xff08;填空10分_枚举&#xff09; 4D&#xff1a;数的分解&#xff08;填空10分&#xff09; 5E&#xff1a;迷宫…

UI-APP---基于HBuilder X的微信小程序

目录 概要 Uni-app 和 HBuilderX 的关系 技术名词解释 ui-app: 概念&#xff1a; 核心特点&#xff1a; 技术细节 基本步骤&#xff1a; 开发流程 项目功能分析&#xff1a; ①首页包括公共头部、导航栏、轮播图、视频列表区域。 ②视频详情页包括公共头部区域、视频详情区域、…

多宠识别:基于计算机视觉的智能宠物管理系统架构解析

一、行业痛点与技术方案演进 在多宠家庭场景中&#xff0c;传统方案面临三大技术瓶颈&#xff1a; 1. 生物特征混淆&#xff1a;同品种/毛色宠物识别准确率低于65% 2. 动态场景适应&#xff1a;进食/奔跑状态下的误检率达30% 3. 数据孤岛问题&#xff1a;离线设备无法实现持续…

论文阅读分享——UMDF(AAAI-24)

概述 题目&#xff1a;A Unified Self-Distillation Framework for Multimodal Sentiment Analysis with Uncertain Missing Modalities 发表&#xff1a;The Thirty-Eighth AAAI Conference on Artificial Intelligence (AAAI-24) 年份&#xff1a;2024 Github&#xff1a;暂…

Unity组件大全之 Layout 组件 |(27)Content Size Fitter 内容大小适配器

&#x1f4c2; Unity 开发资源汇总 | 插件 | 模型 | 源码 &#x1f493; 欢迎访问 Unity 打怪升级大本营 在 Unity 的 UI 系统中&#xff0c;Content Size Fitter 是一个重要的布局组件&#xff0c;能够根据内容动态调整 UI 元素的尺寸。它通过自动检测内容的大小来改变元素的宽…

<3D建模>.max文件转换为.fbx文件

今天在使用unity3D开发软件时&#xff0c;下载了.max文件。大家知道.max文件是3DMax生成的文件&#xff0c;然而我的电脑中也没有3DMax&#xff0c;而unity中的场景文件通常要用到.fbx文件&#xff0c;这可怎么办呢&#xff1f;难道要去下载一个3DMax软件吗&#xff1f;其实并不…

【js逆向】iwencai国内某金融网站实战

地址&#xff1a;aHR0cHM6Ly93d3cuaXdlbmNhaS5jb20vdW5pZmllZHdhcC9ob21lL2luZGV4 在搜索框中随便输入关键词 查看请求标头&#xff0c;请求头中有一个特殊的 Hexin-V,它是加密过的&#xff1b;响应数据包中全是明文。搞清楚Hexin-V的值是怎么生成的&#xff0c;这个值和cooki…

国内免费使用 Claude 3.7 Sonnt,GPT-4o,DeepSeek-R1联网极速响应

地址我放在下面了&#xff01;打开即用&#xff0c;也支持在ChatBox、Cursor、Dify、VSCode这些平台调用API令牌 注册登录进来之后&#xff0c;系统会自动赠送免费额度&#xff0c;可以使用Open、Claude、DeepSeek这些系统支持的全部模型。 我将经常使用到的模型型号都列在下…

面向高质量视频生成的扩散模型方法-算法、架构与实现【附核心代码】

目录 算法原理 架构 代码示例 算法原理 正向扩散过程&#xff1a;从真实的视频数据开始&#xff0c;逐步向其中添加噪声&#xff0c;随着时间步 t 的增加&#xff0c;噪声添加得越来越多&#xff0c;最终将原始视频数据变成纯噪声。数学上&#xff0c;t 时刻的视频数据与 t…

使用免费IP数据库离线查询IP归属地

一、准备工作 1.下载免费IP数据库 首先&#xff0c;访问 MaxMind官网&#xff08;https://www.maxmind.com/en/home&#xff09;如果你还没有MaxMind账号&#xff0c;可以通过此链接地址&#xff08;https://www.maxmind.com/en/geolite2/signup&#xff09;进行账号注册&…

Python----数据可视化(Seaborn二:绘图一)

常见方法 barplot方法 单独绘制条形图 catplot方法 可以条形图、散点图、盒图、小提亲图、等 countplot方法 统计数量 一、柱状图 seaborn.barplot(dataNone, xNone, yNone, hueNone, colorNone, paletteNone) 函数描述data用于绘图的数据集。x用于绘制长格式数据的输入。…

C/C++中使用CopyFile、CopyFileEx原理、用法、区别及分别在哪些场景使用

文章目录 1. CopyFile原理函数原型返回值用法示例适用场景 2. CopyFileEx原理函数原型返回值用法示例适用场景 3. 核心区别4. 选择建议5. 常见问题6.区别 在Windows系统编程中&#xff0c;CopyFile和CopyFileEx是用于文件复制的两个API函数。它们的核心区别在于功能扩展性和控制…

SpringBoot 如何调用 WebService 接口

前言 调用WebService接口的方式有很多&#xff0c;今天记录一下&#xff0c;使用 Spring Web Services 调用 SOAP WebService接口 一.导入依赖 <!-- Spring Boot Web依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId…

tomcat单机多实例部署

一、部署方法 多实例可以运行多个不同的应用&#xff0c;也可以运行相同的应用&#xff0c;类似于虚拟主机&#xff0c;但是他可以做负载均衡。 方式一&#xff1a; 把tomcat的主目录挨个复制&#xff0c;然后把每台主机的端口给改掉就行了。 优点是最简单最直接&#xff0c;…

计算机视觉算法实战——老虎个体识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 领域介绍 老虎个体识别是计算机视觉中的一个重要应用领域&#xff0c;旨在通过分析老虎的独特条纹图案&#xff0c;自动识别和区…