一、ES是什么
ES官网:https://www.elastic.co/cn/elasticsearch
ES是什么(官方解释):Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,Elasticsearch 会集中存储您的数据,让您飞快完成搜索,微调相关性,进行强大的分析,并轻松缩放规模。
个人觉得,ES就是专门用于搜索而产生的数据库,它能基于算法对海量数据实现快速的查找功能。
二、为什么要用ES
同为拥有查询功能的数据库例如mysql也能够实现数据的快速查找功能为何还需要专门使用ES?
因为数据库的查询它是基于sql语句,有了sql之后需要遍历整一张相关的数据库表,随后返回给你需要的数据,但如果此时数据量特别大,使用数据库查询的的效率会非常慢,而ES采用倒排索引的功能能够快速的实现全文检索;并且ES有很强大的分词搜索功能(可以理解为传统数据库的模糊查询),在输入关键词后ES会自动对关键词进行分词从而查询出所有和该词相关的信息,这点也是传统数据库的模糊查询所不能比拟的。
什么是倒排索引
了解倒排索引前我们首先需要知道正排索引
倒排索引:将标题的关键字进行拆分,记录每个拆分后的关键词在正排索引中出现的位置
三、ES的下载和安装(以mac m1芯片为例)
ES的安装见该文章:https://blog.csdn.net/m0_68772878/article/details/134452544
ES插件,ik分词器的安装:
如果不安装ik分词器,只能使用ES自带的标准分词模式,在标准分词模式下,分词的精细程度并不完全,并且只能够对英文进行友好的分词,如果是进行中文分词,它的结果是将整句话拆成一个一个的字,这并不符合我们日常的阅读习惯和检索习惯
下载地址:https://blog.csdn.net/m0_68772878/article/details/134452544
下载好后,将下载的压缩包解压指至ES所在目录的plugins目录内,运行ES服务后,看到如下内容并且不报错表示ik分词器插件运行正常
注意:下载ik分词器的版本必须要和ES的版本保持一致,否则会在启动ES服务时报错或者或者导致使用ik分词功能不可用
IK分词器版本与ES版本不一致的解决方式:
找到ik分词器插件目录,进入该目录后找到plugin-descriptor.properties文件,搜索'version': plugin's version关键词条,将version改成对应的ES版本,我这里使用的是8.11.1,因此🔽
四、ES的核心概念
1、Document:文档
相当于就是一条由多个字段的内容合并而成的一条信息,通常以Json格式进行保存
2、Field:字段
相当于列,定义每个document应该有的字段
3、Index:索引
文档存储的地方,类似于MySQL数据库中的数据库概念
五、技术测试(在没有进行springboot整合前,我们使用HttpRequest的形式进行测试)
1、访问ES首页:
#发送访问elasticsearch服务的请求
GET http://localhost:9200
2、发送分词请求
注意:在同一个页面中两次请求之间需要用“###”进行分隔,否则下一个请求无法实现
###发送分词请求
POST http://localhost:9200/_analyze
Content-Type: application/json
{
"text": "hello,i like learn java",
"analyzer": "standard"
}
3、指定分词模式为ik_smart
分词模式讲解:
ik_smart分词模式可以理解为是只能分词模式,在使用ik分词器后, 如果使用
smart模式,它会自动并且快速的帮我们将文本进行分词,他的速度快,占用空间
较小,但是分词仍然比较粗略
###使用ik分词器,指定分词模式为ik_smart
POST http://localhost:9200/_analyze
Content-Type: application/json
{
"text": "我们是中华人民共和国的公民,享有同等的权利和义务",
"analyzer": "ik_smart"
}
4、指定分词模式为ik_max_word
分词模式讲解:
能够将文本详细的进行分词,查询时查全率高,但是较耗费性能,查询速度比
较慢
###使用ik分词器,指定分词模式为ik_max_word
POST http://localhost:9200/_analyze
Content-Type: application/json
{
"text": "我们是中华人民共和国的公民,享有同等的权利和义务",
"analyzer": "ik_max_word"
}
5、设置停止词:
设置略过词,当分词遇到这些词语时会自动略过。
找到ik分词器插件,找到config目录,进入目录后找到stopword.dic文件,添加也无
需要的停止词后保存,重新运行ES服务,使用http请求设置需要分词的text,即可看到停
止词没有被今次那个分词操作
6、创建和删除一个索引:
创建索引我们需要在请求的后方添加索引的名字,例如这里取名为question
PUT http://localhost:9200/question
删除索引我们需要将请求方式变更为DELETE
DELETE http://localhost:9200/question
7、设置索引的“属性”:
###给索引设置属性,设置索引中的数据自动分词
# properties表示要设置的具体属性
#title 和content表示我们要设置分词的具体字段(即我们要给哪些列设置分词)
# analyzer和search_analyzer表示不仅在索引中会有分词规则,我们输入的查询关键字也会进行分词
POST http://localhost:9200/question/_mapping
Content-Type: application/json
{
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
}
}
8、添加文档(Document):
###添加文档(给每个字段添加值)
#请求当中的数字1和下方的id=1没有任何关系,请求的数字1表示该行(文档)的编号,而id=1表示这条数据的编号
POST http://localhost:9200/question/_create/1
Content-Type: application/json
{
"id": 1,
"title": "docker是什么",
"content": "他是能够运行镜像文件的虚拟机"
}
注意:不同ES版本的请求方式可能有所不同,如果执行请求出现“error“ : “no handler found for uri [xxx] and method [POST]或者[GET]”错误需要考虑是否是请求格式有误,解决方案可查看:“error“ : “no handler found for uri [xxx] and method [POST]或者[GET]”-CSDN博客
9、查询文档:
数字“3”表示文档编号,而不是文档内的id编号
GET http://localhost:9200/question/_doc/3
10、修改某个文档内的响应字段的值
POST http://localhost:9200/question/_update/3
Content-Type: application/json
{
"doc": {
"title": "'=='比较的是什么,equal比较的是什么",
"content": "==比较的是变量的值,equal比较的是引用地址"
}
}
11、删除某一条文档数据:
DELETE http://localhost:9200/question/_doc/3
12、指定字段进行查询:
###指定字段进行查询文档数据
#query和match格式固定不变,表示要查询和匹配,匹配的格式写在match里
POST http://localhost:9200/item/_search
Content-Type: application/json
{
"query": {
"match": {
"字段名": "查询的关键词"
}
}
}
13、指定多字段进行查询:
如下查询条件返回的结果是即符合字段名1的值又符合字段名2的值的文档,如
果希望返回满足其一的结果数据,可以把must修改为should,“should”相当于mysql语句
中的or
###指定多字段查询
#query{bool{must[{match{字段名1}},match{字段名2}}]}}
#query表示查询,bool表示要查询多个字段,must相当于mysql语句中的and
POST http://localhost:9200/question/_search
Content-Type: application/json
{
"query": {
"bool": {
"must": [
{
"match": {
"字段名1": "查询的关键词"
}
},
{
"match": {
"字段名2": "查询的关键词"
}
}
]
}
}
}