Elasticsearch学习,请先看这篇!

news2024/7/6 19:17:01

目录

一、初始elasticsearch

1、概述

简介

发展

2、倒排索引

3、基本概念

文档

索引

Mysql和es的区别

4、分词器

初始分词器

Ik分词器-扩展词库

二、索引库操作

1、mapper属性

2、创建索引库

 3、查询、删除索引库

三、文档操作

1、新增文档

 2、查询、删除文档

 3、修改文档

四、RestClient

1、什么是RestClient

2、JavaRestClient

建立mapping映射

初始化JavaRestClient

创建索引库

操作索引库

操作文档

五、DSL查询文档

1、DSL查询语法

查询所有

全文检索查询

精确查询

地理查询

复合查询

2、搜索结果处理

排序

分页

高亮

3、RestClient


一、初始elasticsearch

1、概述

简介

es是一款强大的开源搜索引擎,开源帮助我们从海量数据中快速找到需要的内容

elasticsearch是elastic stack(ELK)包含Kibana、Logstash、Beats

发展

Lucene

Lucene是java语言的搜索引擎类库,apache公司顶级项目,1999年研发

优点易扩展,高性能(基于倒排索引),缺点只限于java语言,学习曲线陡峭,不支持水平扩展

Compass

2004是由shay banon基于Lucene开发的

elasticsearch

2010年Shay banon重写了Compass并取名为elasticsearch

比lucene的优点:支持分布式,可水平扩展。提供restful,可被任何语言调用

2、倒排索引

传统的正向索引:例如下面的图,会去从1开始一条条模糊匹配任何匹配的放到结果集返回了,如果有1000万条数据,就要扫描1000万次

倒排索引:

文档(document):每个商品就是文档,

词条(term):文档按照语义分成的词语

就是把词语先分词提前存好,每个词语对应的id,当我们要搜索的时候就通过词语拿到所有匹配的id来返回,这种方式的效率就比原本正向的高很多。

 

适用场景:更适合基于文档去搜索内容,比如搜索异常信息和局部的单词搜索等等。

3、基本概念

文档

es是面向文档存储的,可以是数据库中的一条商品数据,一个订单信息

文档数据会被序列化为json格式后存储在es中

索引

相同类型的文档的集合

映射mapping:索引中文档的字段约束信息,类似表的结构约束

Mysql和es的区别

mysql擅长事务类型操作,可以保证数据安全和一致

es擅长海量数据的搜索、分析、计算

4、分词器

初始分词器

es在创建倒排索引时需要对文档分词,在搜索时,需要对用户输入内容分词,但默认分词规则对中文处理不好,中文会被分成一个个的字

处理中文分词,一般用IK分词器

安装IK分词器:找到数据局目录,然后把安装好的ik分词器,解压分词器安装包,放到es容器的插件数据卷中,重启容器。

 

ik_smart粗力度划分,分的词语不够多但是占用内存小

ik_max_word细粒度划分,分的词语多匹配更加多,但是内存大

Ik分词器-扩展词库

我们发现很多词语是没有的,不会自动分词,比如一些新的网络词汇,要扩展ik分词器,只需要修改ik分词器目录中config目录中的ikAnalyzer.cfg.xml文件,然后在里面写上文件

不仅仅可以扩展,还可以禁止一些词语,比如分的时候“的”字就是没有意义还占用内存,还有紧张搜索的敏感词汇也可以禁止了

二、索引库操作

1、mapper属性

mapping是对索引库中文档的约束,常见的mapping属性包括:

type:字段数据类型,常见的简单类型有:

  • 字符串:text(可分词的文本)、keyword(精确值,最小不能拆分的:国家、品牌、IP地址)
  • 数值:long、integer、short、byte、double、float
  • 布尔:boolean
  • 日期:date
  • 对象:Object

(在es里面是没有数组这个概念的,可以有很多个同类型的数值)

index:是否创建索引,默认为true,如果true就会创建倒排索引,将来就能搜索了,实际上并不是所有字段都需要参与搜索的,所以要手动把一些设置成false

analyzer:使用那种分词器,结合字符串的text来使用的

properties:该字段的子字段(可以指定对象的子属性)

2、创建索引库

ES中通过restful请求操作索引库、文档。请求内容用DSL语句来表示,创建索引库和mapping的DSL语句如下:

 3、查询、删除索引库

查询用get,删除用delete,修改用put(es没有办法修改的其实,因为每次修改要查询维护倒排索引库非常麻烦,所以修改其实是在原本的索引库里面添加新字段

 

三、文档操作

1、新增文档

新增文档的DSL语法

 

 2、查询、删除文档

 3、修改文档

全量修改请求方式是put,既能做修改,也能做新增,当id没有的时候就代表新增了,他是先删除逐个id然后再新增的,如果id没有就直接增了

指定修改,就是修改指定的值,请求方式是post,中间的路径得改成_update

四、RestClient

1、什么是RestClient

ES官方提供了各种语言的客户端,用来操作es,这些客户端用来组装DSL语句,通过HTTP请求发送给ES

2、JavaRestClient

建立mapping映射

先根据数据库的表建立对应es的mapping

 

 

在es里面经纬度比较特殊,要用geo_point

需求:现在想要根据多个字段来搜索,但是多个搜索没有根据一个来搜性能好?怎么办?

es提供了组合查询,类似联合索引的概念,可以单独提出一个字段叫all,把想加进去的属性加上copy_to:all

提示:字段拷贝可以使用copy_to属性将当前字段拷贝到指定字段

初始化JavaRestClient

@BeforeEach是在测试方法@Test前执行,@AfterEach是在测试方法后执行,都是junit的注解

创建索引库

常量里面直接写json对象就行

操作索引库

索引库操作的基本步骤:

  • 初始化RestHighLevelClient
  • 创建XxxlndexRequest。XXX是CREATE、Get、Delete
  • 准备DSL (CREATE时需要)
  • 发送请求。调用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete

操作文档

新增

要用过fastJson工具类把对象序列化为json对象存到es

查询

修改 

删除

批量导入

文档操作的基本步骤

  • 初始化RestHighLevelClient
  • 创建XxxRequest。XXX是Index、Get、Update、Delete
  • 准备参数 (index和Update时需要)
  • 发送请求。调用RestHighLevelClient#xxx0方法,xxx是
  • index、get、update、delete
  • 解析结果(Get时需要)

五、DSL查询文档

1、DSL查询语法

DSL是基于restful风格的查询语句,用来查询es的

查询语句分类:

  • 查询所有:查询出所有数据,一般测试用。例如:match all
  • 全文检索 (fulltext)查询: 利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:
    • match query
    • multi_match query
  • 精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:
    • ids
    • range
    • term
  • 地理(geo)查询: 根据经纬度查询。例如:
    • geo distance
    • geo_bounding_box
  • 复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。例如
    • bool
    • function_score

查询所有

由于查询所有并不需要指定条件,所以条件值不用写

全文检索查询

我们搜索的时候尽量使用match搜一个字段,然后用all就可以把多个属性放到一个字段来搜索,这样效率比直接搜多个字段快

  • match:根据一个字段查询
  • multi match:根据多个字段查询,参与查询字段越多,查询性能越差

精确查询

精确查询一般查询keyword、数值、日期、boolean等类型字段,所以不会对搜索条件进行分词

  • term:根据词条精确匹配,一般搜索keyword类型、数值类型、布尔类型、日期类型字段
  • range: 根据数值范围查询,可以是数值、日期的范围

地理查询

根据经纬度查询,官方文档,例如:

geo_bounding_box:适合查询一定范围内所有的信息。 

geo_distance:查询到指定中心店小于某个距离值的所有文档,适合做附近的人

复合查询

复合查询:复合查询可以将其他简单查询组合起来,实现更复杂的搜索逻辑

fuction score:算分函数查询,可以控制文档相关性算法,控制文档排名

es中相关打分算法:

TF-IDF:es5.0之前,会虽则词频增大而越来越大

BM25:在es5.0之后,词频增大,但增长曲线会趋于水平

Function Score Query

Boolean Query

布尔查询是一个或多个查询子句的组合,子查询的组合方式有:

must:必须匹配每个子查询,类似与

should:选择性匹配子查询,类似或

must_not:必须不匹配,不参与算分,类似非

filter:必须匹配,不参与算分

下面这些就固定的不参与算分,可以提高搜索效率,而且这种不参与算分的往往会放到缓存里,进一步提高效率,参与算分条件越多,查询的性能越差

图中:must_not来查询价格,小于500的,就是要查实际上大于500的,之所以用这个反着查就是为了提高效率,因为不用参与算法,而且这个价格的权重也不重要,所有这样效率最高,项目filter搜分大于45也是如此,关键词才需要参与算分的,不参与算分全部放到must_not和filter里面

2、搜索结果处理

排序

es支持对结果进行排序,默认是根据分值排序,可以排序的字段类型:keyword类型、数值类型、地理坐标类型、日期类型等

 

分页

es默认情况只返回top10的数据,而如果要查询更多数据就需要修改分页参数了

es中通过from、size参数来控制要返回的分页结果: 

ES是分布式的,所有会面临深度分页问题,例如按price排序后,获取from=990,size为10的数据

深度分页解决方案

针对深度分页,es提供两种解决方案

search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式

scroll:原理将排序数据形成快照,保存在内存,官方已经不推荐使用。(内存消费非常大,而且将来es一更新快照还是旧的数据)

高亮

如图我们可以观察到,搜索出来的结果会高亮,其实加了标签,是谁加的呢?其实是es服务端加的,他给关键字加了标签,然后返回给前端。

 

 require_field_match为false代表搜索的属性不一定要匹配,用all来搜可以高亮name的

3、RestClient

搜索全部

解析对象

全文检索查询

精确查询

boolean查询

排序和分页

高亮

先看看请求的DSL构建

高亮结果处理

总结

所有的DSL构建,都是用SearchRequest的source()方法

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

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

相关文章

计算机网络科普

文章目录 1、集线器2、CSMA/CD协议3、交换机3.1 交换机的桥接 4、 路由器5、 路由表6、IP地址7、MAC地址8、ARP协议9、关于网络层次模型10、路由器 1、集线器 计算机之间的相互通信,你会怎么设计? 如果是两台计算机,之间拉一条线,…

ClickHouse性能优化

目录 1 Explain查看执行计划优化sql1.1 基本语法1.2 案例实操1.2.1 查看 PLAIN1.2.2 AST 语法树1.2.3 SYNTAX 语法优化1.2.4 查看 PIPELINE 2 ClickHouse建表优化2.1 数据类型2.1.1 时间字段的类型2.1.2 空值存储类型 2.2 分区和索引2.3 表参数2.4 写入和删除优化2.5 常见配置2…

分享一些提升效率的小工具

1、 IObit Uninstaller IObit Uninstaller是一款简单专业的卸载工具,可以帮我们卸载电脑中顽固难卸的软件和浏览器插件,支持强制一键卸载和文件粉碎功能。 除了卸载软件,它还可以自动帮我们检测软件安装、检测软件更新、查看工具栏和插件。 …

IDEA22.3.3的三个常用经常遇到的配置问题

1、期待效果:【打开iDEA的时候,让开发者选择需要打开的项目】 设置如下 2、期待效果:配置默认的Maven,避免每次新建项目后,都需要去修改Maven配置 同理,修改默认的java版本和自己本地java环境一致 3、新建…

数据库SQL语句优化技巧

当今世界,数据量不断增长,数据库的使用变得越来越普遍。虽然数据库提供了很多强大的功能,但是它们也需要被优化以确保它们的性能得到最大化。在本篇博客中,我们将探讨SQL语句优化的几种技巧,这些技巧可以帮助您提高数据…

零、网络基础概述(TCP/IP模型、端口、网关、DNS、ARP、IP编址与子网划分、UDP、VRP)

文章目录 前言一、网络基础1、TCP/IP模型2、端口的作用:3、MAC 地址4、网关(gateway)5、域名解析服务(DNS)6、TCP端口、UDP端口区别:7、交换机与路由器 二、ARP 理论1、定义2、查看ARP缓存3、ARP 报文种类&…

Linux基础——远程访问及控制(SSH)

Linux基础——远程访问及控制 一、OpenSSH服务器二、sshd_config配置文件三、SSH服务端1.查询版本—— ssh -V2.SSH远程登录3.监听端口修改4.设置黑白名单5.远程复制——scp6.安全性传输——sftp 四、SSH服务的验证1.SSH服务的两种验证方式密码验证密钥验证 3.公钥与私钥的关系…

ORA-04021:等待锁定对象时发生超时

现场人员反馈问题,drop表报错,如下图 是个rac环境,处理过程 1、2个节点上查看锁表,没任何输出 SYSorcl2> select name from v$db_object_cache where ownerUSR_DATAI and type in(PROCEDURE,FUNCTION) and locks > 0 and …

软件版本号

版本号 上图是在MVN仓库中随便找的一个依赖的历 史版本 我们可以发现版本号一般是由 数字英文 组成 数字 一般大家都会看到1.x或者1.xx.xxx.Beta这种版本号,前面是数字 以 1.xx.xxx 为例 1是major号,一般重大更新会更新major号.xx或者.xx.xxx称为min…

arduino学习笔记1

一.hello word实验 1.基础结构 void setup() {// put your setup code here, to run once://设置初始状态,比如引脚、波特率等 }void loop() {// put your main code here, to run repeatedly://相当于main函数,但一直循环 }2.Serial(串行通…

像素是什么

像素分为设备像素和设备无关像素。 下面说说来龙去脉。 一、显示器 显示图像的电子设备。 (一)显示器种类 1.LCD LCD(Liquid crystal display),是液体晶体显示,也就是液晶显示器,LCD具有功耗低…

谷歌 Google Cloud 安装 NodeJS服务环境

目录 1. 安装 wget2. 安装 Node2.1 下载安装包2.2 安装包解压2.3 3 安装全局包并创建软链接 3. 安装 git 创建实例略过,点击 SSH 按钮, 在浏览器中打开SSH客户端 注: 本文基于 CentOS 9服务器操作系统 为了方便后面工具插件的顺利安装&a…

用PHP实现经典的4种排序算法

文章目录 一、前言二、4种排序算法2.1 快速排序2.2 插入排序2.3 选择排序2.4 冒泡排序 总结 一、前言 排序算法是一种将一组无序的数据元素按照某个规则(大小、字母序等)排列成有序的序列的算法。常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。 1.冒…

Python批量梯度下降法的举例

梯度下降法 梯度下降法是一种常用的优化算法,用于求解目标函数的最小值。其基本思想是,通过不断地朝着函数梯度下降的方向更新参数,直到找到函数的最小值。 具体来说,假设我们有一个可导的目标函数 f ( x ) f(x) f(x)&#xff…

项目五:使用路由器构建园区网

使用路由器构建园区网 1、新建拓扑2、配置交换机与主机3、配置路由交换机并进行通信4、通信测试5、配置路由器并进行通信测试1、配置路由器R-12、配置路由器R-2、R-33、通信测试 1、新建拓扑 依次添加四台主机,两台交换机,型号为S3700。两台路由交换机&…

体制内干部职务职级及领导干部排序对应关系大全

请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 一、公务员级别对应关系 (一)综合管理公务员职务与职级 1、职务分为10级,包括:正国职、副国职、正部职、副部职、正…

【WSN定位】基于加权双曲线的Dvhop定位算法【Matlab代码#16】

文章目录 1. 原始Dvhop定位2. 基于双曲线的Dvhop定位3. 对原始模型加权4. 部分代码5. 结果展示6. 资源获取7. 参考文献 1. 原始Dvhop定位 可参考Dvhop定位算法 2. 基于双曲线的Dvhop定位 双曲线定位算法是一种通过将待定位节点定位在以锚节点为焦点、两锚节点之间距离为焦距…

字符集与字符编码(ASCII、GBK、UNICODE)

1 常见编码 1.1 单字节编码:ASCII ASCII使用1个字节(8个bit)来记录一组常用字符,见下表: 例如其中字母a的二进制位:1100 001 97,那么a在计算机中就可以用1100001来保存。 注意上表中其实只…

【02-Java Web先导课】-Tomcat服务器的下载与安装

文章目录 前言一、Tomcat服务器(apache-tomcat-8.5.28)的 下载1、下载地址 二、Tomcat服务器的安装1、Tomcat目录结构2、Tomcat的启动与停止4、Tomcat启动成功后的测试 免责声明: 前言 Tomcat主要实现了Java EE中的Servlet、JSP规范&#xf…

【Python爬虫项目实战三】Ddddocr识别Ocr过开放猫验证码(接Authorization认证更新)

目录 🍇前言🍍验证码识别的几个方法🥥百度AI开放平台🥥Ddddocr🦑分析验证码位数🦑获取验证码接口🦑算法识别匹配🦑请求登陆接口 🍋总结: 🍇前言 …