ElasticSearch 和 Lucene 的关系:
ElasticSearch 简称 ES,是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储,检索数据;本身扩展性很好,可以扩展到上百台服务器上,处理PB级别的数据。ES也是用Java开发并使用Lucene作为其核心实现所有的索引和搜索的功能,但是他的目的是通过简单的 RestFul API来隐藏Lucene的复杂性,让全文搜索变得更简单
2016年1月,ElasticSearch 超过 Solr,成为排名第一的搜索引擎应用
谁在使用:
ElasticSearch 用于 全文搜索、结构化搜索、分析
Solr 是 Apache 下的一个顶级开源项目,采用Java开发,基于 Lucene 的全文搜索服务器,Solr 提供了比 Lucene 更为丰富的查询语言,同时实现了可配置,可扩展,并对索引、搜索性能进行了优化
Solr 可以独立运行在 Jetty 等Servlet容器中,
Solr 是一个独立的企业级搜索应用服务器,实际上就是封装了 Lucene,对外提供类似于 Web-service的API接口,用户可以通过http请求,想搜索引擎服务器提交一定格式的文件,生成索引,也可以通过提出查找请求,得到结果
ElasticSearch vs Solr:
ELK 是 ElasticSearch、Logstash、Kibana 三大开源框架首字母大写的简称。市面上面也称作 Elastic Stack ,其中 ElasticSearch 是一个基于 Lucene、分布式、通过 ResrFul 方式进行交互的近实时搜索平台台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用ElasticSearch 作为底层支持框架,可见 ElasticSearch 提供的搜索功能很强大。
市面上我们简称ElasticSearch 为ES。Logstash 是ELK中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elastisearch/kafka等),Kibana 可以将 ElasticSearch 的收据通过友好的界面展示出来,提供实时分析的功能。
收集清洗数据 => 搜索、存储 => Kibana
市面上很多开发,只要提高ELK都能够说出他是一个日志分析架构技术栈的总称,但实际上ELK不仅仅适用于日志分析,它还可以支持其他任何数据分析和收集的场景,日志分析和收集只是更具有代表性,并非唯一性
最低要求 JDK 1.8,maven,web 项目需要有前端环境 node.js相关
官网(比较慢):https://www.elastic.co/cn/downloads/?elektra=home&storm=hero
ElasticSearch: https://mirrors.huaweicloud.com/elasticsearch/?C=N&O=D
logstash: https://mirrors.huaweicloud.com/logstash/?C=N&O=D
可视化界面:elasticsearch-head.https://github.com/mobz/elasticsearch-head
kibana: https://mirrors.huaweicloud.com/kibana/?C=N&O=D
ik分词器 https://github.com/medcl/elasticsearch-analysis-ik
实际生产环境使用 Linux 版本,这里我们学习使用,Windows版本即可
ELK 三件套解压即可使用,
启动:
进入bin目录,双击启动 elasticsearch.bat
如果启动成功,命令行会显示,可以访问地址为 127.0.0.1:9200,
访问地址可以看到json数据,表示启动成功,访问成功
直接查看后台json数据并不友好,我们需要使用可视化工具
elasticSearch head:https://github.com/mobz/elasticsearch-head
查看目录结构可以得知,这是一个前端项目,需要提前安装node.js
如何启动这个前端项目?查看项目说明
解压缩文件,进入文件根目录,执行命令行 cnpm install
,安装相关依赖,npm 会根据package.json中配置的依赖进行安装
cnpm是淘宝的镜像,安装速度更快一些
依赖下载成功
启动项目 npm run start
启动成功,访问 http://localhost:9100
发现页面没有数据,因为存在跨域问题,9100端口访问9200端口
配置 elasticsearch.yml 核心配置文件,添加配置,注意yml语法空格缩进
http.cors.enabled: true
http.cors.allow-origin: "*"
表示开启可以跨域访问,允许所有都可以访问,保存,关闭文件
关闭 elasticsearch ,重新启动,
先访问测试 9200端口,可以看到数据,再访问 9100,可以看到访问成功
界面简介:
未来的数据就存放在这里面
这个 head 我们就把他当做数据库连接工具即可,后续我们进行查询可以使用 kibana 工具,效率会更加提高很多
Kibana 是一个针对 elasticsearch 的开源分析及可视化平台,用来搜索、查看交互存储在 elasticsearch 索引中的数据。使用 Kibana 可以通过各种图表进行高级数据分析及展示,Kibana 让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表盘(dashboard)实时显示 elasticsearch 查询动态,设置 Kibana 非常简单,无需编码或者额外的基础架构,几分钟内就可以完成 Kibana 安装并启动 elasticsearch 索引监测
官网:https://www.elastic.co/cn/downloads/?elektra=home&storm=hero
注意:Kibana 下载的版本一定要和 ElasticSearch 的版本一致
解压缩,可以看到这也是个完整的前端工程项目,
Kibana 已经包含了依赖,且有bin目录,进入bin目录,右键管理员运行 kibana.bat 文件,启动比较慢,
访问 5601 端口
访问页面测试可以使用 Postman、curl、elasticsearch-head、这里我们就使用 kibana
以后的搜索测试 请求语句 可以写在这里,通过kibana 来向搜索引擎 elasticsearch 进行查询请求
kibana 默认英文,如何汉化?
修改插件中的国际化设置,进入目录 kibana-7.6.1-windows-x86_64\x-pack\plugins\translations\translations,可以看到有中文的国家化文件,里面包含了中文翻译对照
我们修改 kibana 核心配置文件,在 kibana-7.6.1-windows-x86_64\config 目录下,kibana.yml 添加国际化配置,默认是英文
i18n.locale: "zh-CN"
集群,节点,索引,类型,文档,分片,映射是什么?
elasticsearch是面向文档,关系型数据库和elasticsearch客观的对比!一切都是json
Relational DB | Elasticsearch |
---|---|
数据库(database) | 索引(indices) |
表(tables) | types |
行(rows) | documents |
字段(columns) | fields |
elasticsearch 在后台把每个索引划分成多个分片。每个分片可以在集群中的不同服务器间迁移
初始一个人就是一个集群,默认集群名字 elasticsearch
逻辑设计:
一个索引类型中,包含多个文档,当我们索引一篇文档时,可以通过这样的一个顺序找到它:索引 => 类型 => 文档id,通过这个组合我们就能索引到某个具体的文档。注意:ID不必是整数,实际上它是一个字符串。
文档就是我们的一条条的数据
之前说elasticsearch是面向文档的,那么就意味着索弓和搜索数据的最小单位是文档,,elasticsearch中,文档有几个重要属性:
尽管我们可以随意的新增或者忽略某个字段,但每个字段的类型非常重要,比如一个年龄字段类型,可以是字符串也可以是整形。因为elasticsearch会保存字段和类型之间的映射及其他的设置。这种映射具体到每个映射的每种类型,这也是为什么在elasticsearch中,类型有时候也称为映射类型。
索引就是数据库!
索引是映射类型的容器,elasticsearch 中的索引是一个非常大的文档集合。索|存储了映射类型的字段和其他设置。然后它们被存储到了各个分片上了。我们来研究下分片是如何工作的。
物理设计:节点和分片如何工作
一个集群至少有一 个节点,而一个节点就是一个elasricsearch进程,节点可以有多个索引默认的,如果你创建索引,那么索引将会有5个分片(primary shard,又称主分片)构成,每一个主分片会有一个副本(replica shard,又称复制分片)
上图是一个有3个节点的集群,可以看到主分片P和对应的复制分片R都不会在同一个节点内,这样有利于某个节点挂掉了,数据也不至于丢失。实际上,一个分片是一个Lucene索引,一个包含倒排索引的文件目录,倒排索引的结构使得elasticsearch在不扫描全部文档的情况下,就能告诉你哪些文档包含特定的关键字。不过,等等,倒排索引是什么鬼?
集群、节点、索引、分片 之间的关系:
详细关系参照:Elasticsearch 集群、节点、索引、分片、副本概念
elasticsearch使用的是一种称为倒排索引的结构,采用Lucene倒排索作为底层。这种结构适用于快速的全文搜索,一个索引由文
档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表。例如,现在有两个文档,每个文档包含如下内容:
Study every day, good good up to forever # 文档1包含的内容
To forever, study every day,good good up # 文档2包含的内容
为为创建倒排索引,我们首先要将每个文档拆分成独立的词(或称为词条或者tokens),然后创建一个包含所有不重复的词条的排序列表,然后列出每个词条出现在哪个文档:
term | doc_1 | doc_2 |
---|---|---|
Study | √ | x |
To | x | √ |
every | √ | √ |
forever | √ | √ |
day | √ | √ |
study | x | √ |
good | √ | √ |
every | √ | √ |
to | √ | x |
up | √ | √ |
比如,我们搜索 to forever,只需要查看包含每个词条的文档
term | doc_1 | doc_2 |
---|---|---|
to | √ | x |
forever | √ | √ |
total | 2 | 1 |
两个文档都匹配,但是第一个文档比第二个匹配程度更高。如果没有别的条件,现在,这两个包含关键字的文档都将返回。
再来看一个示例,比如我们通过博客标签来搜索博客文章。那么倒排索引列表就是这样的一个结构:
博客文章(原始数据) | 博客文章(原始数据) | 索引列表(倒排索引) | 索引列表(倒排索引) |
---|---|---|---|
博客文章ID | 标签 | 标签 | 博客文章ID |
1 | python | python | 1,2,3 |
2 | python | linux | 3,4 |
3 | linux,python | ||
4 | linux |
如果要搜索含有python标签的文章,那相对于查找所有原始数据而言,查找倒排索引后的数据将会快的多。只需要查看标签这一栏,然后获取相关的文章ID即可。完全过滤掉无关的所有数据,提高效率!
当然,前提是要先生成索引列表
elasticsearch的索引和Lucene的索引对比
在elasticsearch中,索引(库)这个词被频繁使用,这就是术语的使用。在elasticsearch中,索引被分为多个分片,每份分片是一个Lucene的索引。所以一个elasticsearch索引是由多 个Lucene索引组成的。别问为什么,谁让elasticsearch使用Lucene作为底层呢!如无特指,说起索引都是指elasticsearch的索引。
接下来的一切操作都在kibana中Dev Tools下的Console里完成。基础操作!
什么是IK分词器 ?
分词:
如果要使用中文,建议使用ik分词器!
IK提供了两个分词算法:
下载:https://github.com/medcl/elasticsearch-analysis-ik
版本不全到这里找:https://elasticsearch.cn/download/
下载完毕后,直接放到目录中 elasticsearch\elasticsearch-7.6.1\plugins 即可,注意将分词器的目录名改为 ik
重启 elasticsearch,在启动过程中可以看到,elasticsearch 加载了 ik 分词器
重启失败原因:
elasticsearch 与 ik 分词器版本一定要完全对应上,只对应大版本号不够
解压后,压缩包删除,分词器目录取名ik
kabana 和 head 最好也关掉,一起重启
如何确认 elasticsearch 启动成功加载插件?启动 elasticsearch bin 目录中提供的工具 elasticsearch-plugin.bat
进入 elasticsearch bin 目录启动命令行 elasticsearch-plugin list
表示加载成功
测试使用
进入 kibana 界面 Dev Tools 菜单,发起请求,选择分词算法
【ik_smart】(最少切分)测试:
GET _analyze
{
"analyzer": "ik_smart",
"text": "我是社会主义接班人"
}
发起请求,右侧可以看到分词结果
【ik_max_word】(最细粒度划分)测试
GET _analyze
{
"analyzer": "ik_max_word",
"text": "我是社会主义接班人"
}
ik分词器如何增加配置
进入分词器目录 elasticsearch\elasticsearch-7.6.1\plugins\ik\config ,这个目录包含了各种字典,
我们可以创建的自己的字典,然后配置到 IKAnalyzer.cfg.xml 文件中
新建字典文件,比如,swy.dic,编辑内容,比如添加
泥萌好
swy
这样,泥萌好,swy,就会默认成为一个词,被ik分词器识别
在配置文件 IKAnalyzer.cfg.xml 中,添加
<entry key="ext_dict">swy.dicentry>
重启es,查看启动日志可以看到,我们的新的分词字典已经被加载
开始测试,
可以看到,我们自定义的词已经被看做一个完整的词,以后工作,我们即可配置自己需要的词
一种软件架构风格,而不是标准。只是提供了一组设计原则和约束条件,它主要用于客户端可服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制
method | url地址 | 描述 |
---|---|---|
PUT | localhost:9200/索引名称/类型名称/文档id | 创建文档(指定文档id) |
POST | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
POST | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
GET | localhost:9200/索引名称/类型名称/文档id | 通过文档id查询文档 |
POST | localhost:9200/索引名称/类型名称/_search | 查询所有的数据 |
基础测试
PUT /索引名/类型名/文档id
注意,PUT 后面有空格
查看 elasticsearch 后台数据
本质上是我们添加了一条数据
完成了自动增加索引,数据成功添加
需要注意的是,只要可以发送规定格式的请求就可完成操作,不一定使用kibana,postman,也可以,但是用kibana很专业,而且输入时有提示,降低出错率
如何给数据中的数据指定类型?
官方有详细讲解
指定字段类型,再次添加数据,这里我们先不添加数据,只是制定规则
查看后台控制,可以看到,新增加了一个索引test2,但是没有数据
创建索引的时候,如果不指定字段属性类型,则会使用默认类型,当然也可以显示的声明
查看后台数据
发送请求查看数据,可以看到,age默认给了long类型,birthday默认给了date类型,name默认给了text类
但是有个缺点,对于修改来说,如果旧的数据有一个属性,新修改的指令里没有添加这个属性,那么修改后这个属性就会消失
由于之前我们己经创建这个数据,所以这次创建直接将原来的覆盖,而且version还显示了版本号增加了
第二种,使用正统的修改指令 POST
获取健康值
其实 elasticsearch-head后台管理页面就是不断地向服务器发送请求,获得的数据
查看所有信息
根据提示可以在 _cat后面添加很多指令进行查看
创建文档
PUT /swy/user/1
{
"name": "swy01",
"age": 25,
"desc": "every will be ok",
"tags": ["高","富","帅"]
}
得到结果
{
"_index" : "swy",
"_type" : "user",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 5
}
不推荐使用put,推荐使用post,只需该对应的字段即可,不必添加所有的字段
POST swy/user/1/_update
{
"doc": {
"name": "Mike"
}
}
通过id查询
GET swy/user/_search?q=name:Mike
复杂操作查询:select(排序,分页,高亮,模糊查询,精准查询)
查询具体的参数使用 json
GET swy/user/_search
{
"query": {
"match": {
"name": "jack"
}
}
}
GET swy/user/_search
{
"query": {
"match": {
"name": "jack"
}
},
"_source": ["name","desc"