ElasticSearch
- 一、初识ElasticSearch
- 1、ES的介绍
- 2、索引
- 3、正排索引
- 3、倒排索引
- 一、安装
- 1、下载
- 2、检查是否启动
- 二、语法
- 1、添加一个文档编辑
- 2、批量插入
- 3、搜索
- 4、查询某个特定的字段
- 5、根据id查询
- 6、修改
- 7、删除
- 8、mapping
- 三、分词器
一、初识ElasticSearch
1、ES的介绍
ES是一个使用Java语言并且基于Lucene( https://lucene.apache.org/ )编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于RESTful风格的WEB接口,官方客户端也对多种语言都提供了相应的API。
Lucene:Lucene本身就是一个搜索引擎的底层。
分布式:ES主要是为了突出他的横向扩展能力。
全文检索:将一段词语进行分词,并且将分出的单个词语统一的放到一个分词库中,在搜索时,根据关键字去分词库中检索,找到匹配的内容。(倒排索引)
RESTful风格的WEB接口:操作ES很简单,只需要发送一个HTTP请求,并且根据请求方式的不同,携带参数的同,执行相应的功能。
应用广泛:Github.com,WIKI,Gold Man用ES每天维护将近10TB的数据。
2、索引
索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针。数据库索引是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。
索引用于加快数据的检索,类似于书籍的索引。在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的内容。
3、正排索引
正排表是以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档。
尽管正排表的工作原理非常的简单,但是由于其检索效率太低,除非在特定情况下,否则实用性价值不大。
3、倒排索引
倒排表以关键字进行索引,关键字所对应的表项中记录了出现这个字的所有文档以及ID,字符出现文档的位置。
一、安装
在学习过程中,选择安装的版本为7.17版本,在ElasticSearch的8版本中有许多安全校验和与springboot版本不适配等情况,所以为了减少学习成本可以选择安装7版本。
1、下载
ElasticSearch安装包:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.22-windows-x86_64.zip
kibana安装包:https://artifacts.elastic.co/downloads/kibana/kibana-7.17.22-windows-x86_64.zip
2、检查是否启动
ES 的启动端口:
-
9200: 给外部用户 (给客户端调用)的端口
-
9300: 给ES 群内部通信的 端口(外部调用不了的)
-
方法一:在浏览器直接输入http://localhost:9200/
-
方法二:使用curl发送http请求
kibana:直接在浏览器访问 http://localhost:5601,kibana可以自由地对ES进行操作(本质也是restful api)。
二、语法
1、添加一个文档编辑
提交以下索引请求,向 log-my _ app-default 数据流添加一个日志条目。因为 log-my _ app-default 不存在,所以请求会使用内置的 log-- 索引模板自动创建它。
POST logs-my_app-default/_doc
{
"title":"我是张三",
"@timestamp": "2099-05-06T16:21:15.000Z",
"event": {
"original": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736"
}
}
响应包含Elasticsearch为文档生成的元数据:
包含该文档的基础 _index。Elasticsearch自动生成基础索引的名称。
文档在索引中的唯一 _id。
2、批量插入
使用_bulk端点一次性添加多个文档。批量数据必须是换行分隔的JSON(NDJSON)。每行必须以换行符(\n)结束,包括最后一行。
PUT logs-my_app-default/_bulk
{ "create": { } }
{ "title":"我是李四","@timestamp": "2099-05-07T16:24:32.000Z", "event": { "original": "192.0.2.242 - - [07/May/2020:16:24:32 -0500] \"GET /images/hm_nbg.jpg HTTP/1.0\" 304 0" } }
{ "create": { } }
{ "title":"我是王五","@timestamp": "2099-05-08T16:25:42.000Z", "event": { "original": "192.0.2.255 - - [08/May/2099:16:25:42 +0000] \"GET /favicon.ico HTTP/1.0\" 200 3638" } }
3、搜索
索引文档可以近实时搜索。以下搜索匹配所有在 logs-my_app-default 中的日志条目,并按 @timestamp 降序排序,match_all表示查询所有,默认情况下,响应的点击部分最多包括与搜索匹配的前10个文档。每次命中的 _ source 包含索引期间提交的原始 JSON 对象。。
GET logs-my_app-default/_search
{
"query": {
"match_all": { }
},
"sort": [
{
"@timestamp": "desc"
}
]
}
4、查询某个特定的字段
对于大型文档来说,解析 whole _ source 非常麻烦。若要从响应中排除它,请将 _ source 参数设置为 false。相反,请使用 fields 参数检索所需的字段。
GET logs-my_app-default/_search
{
"query": {
"match_all": { }
},
"fields": [
"title"
],
"_source": false,
"sort": [
{
"@timestamp": "desc"
}
]
}
5、根据id查询
GET post/_doc/Xt-k05ABhHMTq-ZiYgSK
6、修改
#修改
POST post/_doc/Xt-k05ABhHMTq-ZiYgSK
{
"title":"我是修改后的张三",
"desc":"张三的描述"
}
7、删除
DELETE _data_stream/post
8、mapping
理解为数据库的表结构,有哪些字段、字段类型;
ES支持动态映射,表结构可以动态改变,而不像MySql一样必须手动建表,没有的字段就不能插入。
# 查看文档结构
GET post/_mapping
三、分词器
如果我们直接将这段文本存入Elasticsearch而不使用任何分词器,Elasticsearch可能会将整段文本视为一个整体,导致搜索效果很差。例如,当用户搜索“北京”或“天安门”时,Elasticsearch可能无法找到匹配的文档,因为它只看到了一个完整的字符串“我爱北京天安门”。
由于英文和中文的分词规则不一样,对于英文可能根据空格等进行分词,而对应中文来说显然是不行的,所以我们需要引入一个针对于中文进行分词的分词器,在大部分的企业中主流的中文分词器便是ik分词器(ES的一个插件)。
使用IK分词器的情况
当我们使用IK分词器时,这段文本会被切分为有意义的词语。假设我们使用细粒度分词模式,IK分词器可能会将“我爱北京天安门”切分成以下词语:
- 我
- 爱
- 北京
- 天安门
这些词语将被分别存储到Elasticsearch的索引中。这样,当用户搜索“北京”或“天安门”时,Elasticsearch就能找到匹配的文档,因为这些词语已经被正确地索引了。
ik分词器下载链接:https://github.com/medcl/elasticsearch-analysis-ik/releases
tip:
官网链接会缺少一些对应的版本,可以在这个链接找到全部的版本=>https://release.infinilabs.com/analysis-ik/stable/
IK提供了两个分词算法ik_smart 和 ik_max_word。
- ik_smart:为最少切分
- ik_max_word:为最细粒度划分。
# 分词器
POST _analyze
{
"analyzer": "ik_smart",
"text": "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"
}
POST _analyze
{
"analyzer": "ik_max_word",
"text": "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"
}
后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹