目录
一.认识与了解搜索引擎
1.介绍
Elasticsearch 是一项功能强大且广受欢迎的开源搜索引擎,它不仅显著提升了搜索速度,还广泛应用于各种搜索场景中。事实上,我们所熟悉的百度、360、谷歌等主流浏览器在提供搜索服务时,都借鉴或采用了类似的搜索引擎技术。Elasticsearch 的开源和免费特性,使其成为了开发者们构建高效搜索功能的首选工具。
Elasticsearch 具有下列优势:
1.支持分布式,可水平扩展。
2.提供 Restful 接口,可以被任何语言调用。
而这些特性也使得它成为了一项热门的技术。
随着发展也产生了可以与之相结合的一些技术,分别是 kibana、Logstash、Beats,共同组成一套技术栈,统称为 ELK,被广泛的应用在日志数据分析、实时监控等领域。
2.安装
我们使用 docker 进行 Elasticsearch 以及 Kibana 的安装部署。
2.1.安装 Elasticsearch
将下载好的 tar 包移动到虚拟机中,使用 docker load -i xxx.tar,加载完毕后通过下面的 docker 命令进行安装:
docker run -d \
--name es \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-v es-data:/usr/share/elasticsearch/data \
-v es-plugins:/usr/share/elasticsearch/plugins \
--privileged \
--network hm-net \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:7.12.1
-d:后台运行 --name:起名
-e:配置环境变量:
①:内存配置,默认 1G ②:运行模式(集群/单点)
-v:数据卷挂载:①:数据存储目录 ②:插件目录
--network:网络
-p:端口:
①:Http 访问端口 ②:用于集群间通信
elasticsearch:7.12.1
镜像名:版本
之后就可以在浏览器中通过访问虚拟机的 ip + 端口号 来访问得到响应(Restful 风格)
2.2.安装 Kibana
将下载好的 tar 包移动到虚拟机中,使用 docker load -i xxx.tar,加载完毕后通过下面的 docker 命令进行安装:
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=hm-net \
-p 5601:5601 \
kibana:7.12.1
-e:配置 elasticsearch 的服务器地址 es 是安装 elasticsearch 时的容器名
之后就可以在浏览器中通过访问虚拟机的 ip + 端口号 来访问 Kibana 的平台界面
我们安装 Kibana 主要会使用它其中的开发控制台,便于我们熟悉其语法规则,其他的功能并不会进行学习。
二.初步了解 Elasticsearch
1.倒排索引
ES 在处理大量数据搜索时,速度远远高于传统的关系型数据库,原因就是它的底层使用的是一种倒排索引
传统数据库(如 Mysql)采用正向索引,因其默认引擎为 InnerDB,底层基于 B+ 树将数据挂载到 Id 对应的节点上根据 Id 快速查询,但如果不通过 Id,而是其他例如名称等模糊匹配,则效率会因逐行匹配大大降低。
1.文档(document):每一条数据就是一个文档,文档是Elasticsearch进行数据索引和搜索的基本单位。
2.词条(term):文档按照语义分成的词语,在 Elasticsearch 中,文档的内容会被分词器(Analyzer)分割成一系列的词条,然后这些词条会被索引到 Elasticsearch 的底层数据结构(如倒排索引)中。
不仅给文档建立索引,还会给文档被分成的词语建立索引。在进行搜索时,会执行两次搜索,第一次搜索文档得到词条,第二次根据得到的词条中的文档 Id 来搜索文档,优势是两次搜索都使用了索引来进行匹配,大大提高了搜索效率。
2.IK分词器
分词器的作用是创建倒排索引,对文档分词,以及对文档进行语义分析来分词,像英文单词这种则十分容易分析,而像中文这样博大精深的语言因其一句话通过不同的断句会产生不同的含义(你想吃什么,想吃你下面)。而这就需要一款开源的中文分词器,于是 IK(IKUN )分词器就产生了。其采用的正向迭代最细粒度切分算法一直沿用至今。
可以在 github 上获取到该插件,获取后移动至虚拟机中的 ES 插件对应的数据卷中即可。挂载完毕后 docker restart es 重启 ES 即可加载该插件。
安装后可以在 Kibana 的 DevTools 中来测试 IK 分词器。
这是普通分词器的分词效果。
这是 IK 分词器的分词效果,它具有两种模式,一种为 ik_smart 智能切分,粗粒度;一种是 ik_max_word 最细切分,细粒度。
可以看到它成功的将中文分成了不同的词条,它通过内部的词典来进行遍历分析匹配词条。而随着网络的发展,会出现许多新颖的词汇,而词典的内容是固定的,所以 IK 分词器允许我们配置扩展词典来定义自定义的词库。
配置好本地的词典后,会在当前目录查找扩展词典。
3.基础概念
1.索引(Index):文档数据在 ES 中存储时会被序列化为 json 格式后存储在 ES 中,其中类型相似的归为一类索引,是文档的集合,类似于数据库的表(Table)。
2.文档(Document):就是一条条的数据,类似于数据库中的行(Row),都是 json 的格式。
3.字段(Field):就是 json 文档中的字段,类似于数据库中的列(Column)。
4.映射(Mapping):是索引中文档的约束,例如字段类型约束,类似于数据库中的表结构(Schema)。
5.DSL:是 ES 中提供 json 风格的请求语句,用来定义搜索条件,类似于数据库中的 SQL
三.Elasticsearch基础操作
1.索引库操作
1.1.常见映射属性
首先,想要创建一个索引库,需要先使用 Mapping 去约束索引中的文档,所有需要先了解常见的 Mapping 映射属性。
1.type:字段数据类型常见的有:
1.1.字符串:text(可分词的文本)、keyword(精确值,如国家、ip 地址,不需要分词)
1.2.数值:long、integer、short、byte、double、float 等
1.3.布尔:boolean
1.4.日期:date
1.5.对象:object
2.index:是否创建索引,默认为 true。
3.analyzer:使用哪种分词器,只有 text 类型的数据可能需要,而其它字段大多不需要。
4.properties:该字段的子字段。
1.2.索引库的·CRUD 操作
ES 提供的所有 API 都是 Restful 的接口(GET、PUT、POST、DELETE),遵循 Restful 的基本规范,如 GET、POST、PUT、DELETE 的请求方式。
创建:
PUT /es
{
"mappings": {
"properties": {
"info":{
"type": "text",
"analyzer": "ik_smart"
},
"age":{
"type": "byte"
},
"eamil":{
"type": "keyword",
"index": false
},
"name":{
"type": "object",
"properties": {
"firstName": {
"type": "keyword"
},
"lastName": {
"type": "keyword"
}
}
}
}
}
}
es:索引库名称 properties:属性 info、age、email...:都是字段名
firstName:子字段名
运行后显示运行完成,创建索引库成功。
而类似的查询、删除操作,也可以如上述操作实现。(如 GET /索引库名称)
但修改操作中存在不同,索引库和 mapping 一旦创建无法修改,因其会对数据库中的数据造成很大的影响。但可以添加新的字段,如下图所示,创建一个没有 age 字段的索引库,只能新增 age 字段,而无法修改其他字段,例如该字段的类型。(PUT / 索引库名 / _mapping)
总结
创建索引库:PUT / 索引库名 删除索引库:DELETE / 索引库名
查询索引库:GET / 索引库名 添加字段:PUT / 索引库名 / _mapping
2.文档操作
1.1.文档的 CRUD 操作
与之前的索引库的 CRUD 操作类似,文档的 CRUD 操作也是 Restful 风格。
创建:
在新增文档时要在索引库名后跟 /_doc 表示对文档的操作,后面的 1 代表文档的 id,如果不指定 id 则会随机生成,不便于我们之后的操作。
与之类似的查询、删除操作也是同样的格式:
而在修改操作时,可以使用两种方式:
方式一:全量修改
这种方式会删除旧的文档,添加新文档。但注意如果文档的 id 不正确,会将本不应修改的文档删除,并新增文档。
方式二:增量修改
这种方式可以修改指定的字段值,注意 /_doc 更改为 /_update,并在 “doc":{ } 中添加要修改的字段值。
总结
创建文档:POST/索引库名/_doc/文档id 删除文档:DELETE/索引库名/_doc/文档id
查询文档:GET/ 索引库名/_doc/文档id
修改文档:1.全量修改:PUT/索引库名/_doc/文档id
2.增量修改:POST/索引库名/_update/文档id { “doc”:{ 字段 } }
1.2.批量处理
Elasticsearch 中允许通过一次请求中携带多次文档操作,也就是批量处理,这可以帮助我们快速地进行对文档的各种操作。
语法格式要求一行一行的输入,第一行 "index" 为操作的类型是新增,_index 表示要操作的索引库,_id 表示索引库的文档 id;第二行【 “字段名”:“值”】依次写使用 ,分隔,可以看到成功新增了两个字段,id 分别为 2 和 3。
四.ES 的 Java 客户端
1.客户端的初始化
①.引入 es 的 RestHighLevelClient 依赖
<!--Elasticsearch-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
②.覆盖 SpringBoot 中管理的版本。
在父工程中的版本管理中添加要使用的对应版本覆盖掉 SpringBoot 中管理好的版本。
<elasticsearch.version>7.12.1</elasticsearch.version>
③.初始化
在测试中初始化客户端,使用 setUp 方法在其中进行初始化,其中构建时传入Elasticsearch的地址,这里为虚拟机中部署的地址。而 tearDown 方法用于在测试结束后关闭 client。测试后连接正常,完成初始化。
2.客户端操作
2.1.索引库操作
在设置对应字段的 Mapping 映射时,可以根据库表结构及业务需求来设计映射。而在 Java 中创建索引库的 javaAPI 具体操作与 Restful 接口 API 之间对应。
①.创建 ( Create/Get/Delete ) IndexRequest 对象,指定索引库名。
②.准备请求参数(Create时需要)。
③. 发送请求,调用不同的方法(create、get (exists)、delete)。
●其中 MAPPING_TEMPLATE 是 Json 格式的字符串对应控制台中的数据。
●XContentType.JSON 该枚举表示为 JSON 格式
●indices 方法获取索引库操作的所有法
●RequestOptions.DEFAULT 用作请求选项的默认值。这个对象封装了执行请求时可能需要的配置和参数。
Get 和 Delete
2.2.文档操作
①.创建 IndexRequest 对象,指定索引库名以及 id。
②.准备要创建的文档的 JSON 格式数据。
③. 发送请求,调用不同的方法(create、get (exists)、delete)。
Get和Delete
注意,Get 成功后获取到的数据由右边→_→大红框中的数据,需要进行解析获取对应 Json 信息,输出如下方控制台内容所示。(注意可以直接在 GetRequest 方法中 添加 id)
想要修改文档时也可分为两种操作:
①全量更新:再次写入相同的 id 覆盖掉之前的旧文档。
与新增文档操作一致,只需修改传入 JSON 的内容或传入对象的 JSON 格式字符串前修改对象的属性信息即可。
②局部更新:局部更新,只更新指定的部分字段。
通过 doc 方法传入想要更新的字段名和信息。
2.3.批处理
想要进行批处理,流程与控制台操作类似,但会用到 BulkRequest 封装普通的 CRUD 请求
通过在 BulkRequest 对象中添加多次操作,最后使用 bulk 方法发送请求,进行批处理。
标签:搜索引擎,索引,文档,库名,操作,Elasticsearch,id,分布式 From: https://blog.csdn.net/t46464949/article/details/142796620