笔记记录来源B站狂神的ElasticSearch课程:https://www.bilibili.com/video/BV17a4y1x7zq
世界搜索引擎排行榜:https://db-engines.com/en/ranking/search+engine
注意这句话(看了这句,就知道这哥有多强了!!!)。
#关于
I am a founder of the Apache Lucene, Nutch, Hadoop and Avro open source projects.
I served for six years on Apache's Board of Directors, three as its chair.
#翻译
我是Apache Lucene, Nutch, Hadoop和Avro开源项目的创始人。
我在阿帕奇董事会工作了6年,其中3年是主席。
Lucene是用Java语言编写的,目标是为各种中小型应用软件加入全文检索功能。
2001年,Lucene称为Apache软件基金会 jakarta项目的一个子项目。
2003年,谷歌发表了一篇学术论文,公开介绍GFS(Google File System),是谷歌为了存储海量搜索数据专门设计的文件系统。
2004年,Doug cutting在Lucene的基础之上,和Apache的开源伙伴Mike Cafarella一起开发了一个可以代替当时主流搜索的开源搜索引擎,命名为Nutch
。
Nutch是一个建立在Lucene核心之上的网页搜索应用程序,Nutch在在Lucene的基础上增加了网络爬虫和一些网页相关的功能,目的是为了从简单的站内检索推广到全球网络的搜索上,就想Google一样。
2004年,同年Doug cutting基于Google的GFS论文,实现了分布式文件存储系统,并将其命名为NDFS(Nutch Distributed File System)。
2004年,Google又发表了一篇学术论文,介绍了MapReduce编程模型,用于大规模数据集(大于1TB)的并行分析运算。
2006年,Doug cutting加入了Yahoo(雅虎),他将NDFS和MapReduce进行了升级改造,并将其命名为Hadoop(NDFS也改名为HDFS,Hadoop Distributed File System)。
这就是大名鼎鼎的大数据框架系统—Hadoop的由来,Doug cutting也被称为hadoop之父 (没错,hadoop的logo就是来源于他儿子的玩具大象
)。
2006年,Google又发布学术论文,介绍了自己的BigTable,这是一种分布式数据存储系统,用来处理海量数据的非关系型数据库,同时Doug cutting在自己的hadoop系统里面,引入了BigTable,并将其命名为大名鼎鼎的Hbase。
上面说了那么多,其实对于Doug cutting就一句话,Google出什么,我用什么!
2008年,hadoop成为Apache基金会的顶级项目。
ElasticSearch,简称es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储检索、检索数据;本身扩展性很好,可以扩展到上百太服务器,处理PB级别(大数据时代)的数据。es也是使用Java语言开发的,并使用Lucene作为其核心来实现索引和搜索的功能,但是它的目的是通过简单的RESTFUL API,来隐藏Lucene的复杂性,从而让全文搜索变得简单。
elasticsearch+logstash+kibana
1、当单纯的对已有数据进行搜索时,Solr更快
2、当实时建立索引时,Solr会产生io阻塞,查询性能较差,ElasticSearch具有明显的优势
3、随着数据量的增加,Solr的搜索效率会变得更低,而ElasticSearch却没有明显的变化
4、转变我们的搜索基础设施后从Solr ElasticSearch,我们看见一个即时~ 50x提高搜索性能!
1、es基本是开箱即用(解压就可以用!) ,非常简单。Solr安装略微复杂一丢丢!
2、Solr 利用Zookeeper进行分布式管理,而Elasticsearch自身带有分布式协调管理功能。
3、Solr 支持更多格式的数据,比如JSON、XML、 CSV ,而Elasticsearch仅支持json文件格式(现今json格式是主流形式,基本能够满足绝大部分应用场景)。
4、Solr 官方提供的功能更多,而Elasticsearch本身更注重于核心功能,高级功能多有第三方插件提供,例如图形化界面需要kibana友好支撑。
5、Solr 查询快,但更新索引时慢(即插入删除慢) ,用于电商等查询多的应用;
6、Solr比较成熟,有一个更大,更成熟的用户、开发和贡献者社区,而Elasticsearch相对开发维护者较少,更新太快,学习使用成本较高。
ElasticSearch是7.6.1版本
的,所以最低版本要求,jdk8
。1、下载
2、安装(直接解压即可)
介绍下相关目录及其下的文件的作用:
bin:启动文件目录
config:配置文件目录
1og4j2:日志配置文件
jvm.options:java虚拟机相关的配置(默认启动占1g内存,内存不够的话可以自己调整)
elasticsearch.ym1:es的配置文件! 默认9200端口!跨域!
1ib :相关jar包
modules:功能模块目录
plugins:插件目录,eg:ik分词器
3、进入bin目录,双击elasticsearch.bat
启动es
只要能看到started,就说明是启动成功了,此时我们直接访问地址http://127.0.0.1:9200/
1、下载elasticsearch-head插件
2、下载node(如果已经安装过可以掠过此步骤)
3、安装grunt(这一步也可以省略,不是必须的,当然安装了也没啥影响,可以选用)
npm install -g grunt-cli
grunt -version
4、启动elasticsearch-head
#npm安装
npm install(是国外的镜像,速度会比较慢,还容易安装出错)
#cnpm安装(推荐)
cnpm install(cnpm是国内的淘宝镜像,安装比较快)
#如果cnpm命令不可用,可以使用如下方式配置淘宝镜像
npm install -g cnpm -registry=https://registry.npm.taobao.org
#查看cnpm的版本(出现版本信息说明是安装成功)
D:\dev\elasticsearch\elasticsearch-head-master>cnpm -v
cnpm@7.1.0 (C:\Users\admin\AppData\Roaming\npm\node_modules\cnpm\lib\parse_argv.js)
npm@6.14.15 (C:\Users\admin\AppData\Roaming\npm\node_modules\cnpm\node_modules\npm\lib\npm.js)
node@16.13.0 (D:\Sfotware\node\node.exe)
npminstall@5.2.2 (C:\Users\admin\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\lib\index.js)
prefix=C:\Users\admin\AppData\Roaming\npm
win32 x64 10.0.19042
registry=https://registry.npmmirror.com
#然后再次
cnpm install
# 启动
npm run start
#或者是使用上述安装的grunt工具(都可以)
grunt server
http://localhost:9100
5、跨域问题
6、修改es的参数,允许es被跨域访问,编辑文件config/elasticsearch.yml
# 开启跨域
http.cors.enabled: true
# 所有人访问
http.cors.allow-origin: "*"
7、重启启动es,刷新elasticsearch-head,再次连接
8、如何理解上图(对于初学者来说,姑且认为如下,理解即可)
kibana
工具中进行,后续安装。切忌!!!kibana要和elasticsearch版本保持一直!!!
kibana-7.6.1-windows-x86_64\x-pack\plugins\translations
目录下可以找打zh-CN.json
文件,打开瞧一瞧kibana解压目录/config/kibana.yml
,修改如下参数即可http://localhost:5601/
,此时已经汉化成功ELK是Elasticsearch
、Logstash
、 Kibana
三大开源框架首字母大写简称。市面上也被成为Elastic Stack。
市面上很多开发只要提到ELK能够一致说出它是一个日志分析架构技术栈
总称 ,但实际上ELK不仅仅适用于日志分析,它还可以支持其它任何数据分析和收集的场景,日志分析和收集只是更具有代表性,并非唯一性。
可以简单理解为如下图所示:
收集清洗数据(Logstash) ==> 搜索、存储(ElasticSearch) ==> 展示(Kibana)
集群,节点,索引,类型,文档,分片,映射分别是什么?
至关重要的核心概念:
ElasticSearch是面向文档的。
如下是关系型数据库和ElasticSearch索引库的客观对比!一切都是JSON!
Relational DB | ElasticSearch |
---|---|
数据库(database) | 索引(index) |
表(tables) | 类型(types 慢慢会被弃用) |
行(rows) | 文档(documents ) |
列(columns) | 字段映射(fields-mapping) |
elasticsearch(集群)中,总结如下:
- 一个索引类型中,包含多个文档,比如说文档1,文档2。
- 当我们索引一篇文档时,可以通过这样的顺序找到它:
索引 => 类型 => 文档ID
,通过这个组合我们就能索引到某个具体类型的文档。- 注意:ID不必是整数,实际上它是个字符串。
1、文档(行)
之前说elasticsearch是面向文档的,也就是意味着索引搜索数据的最小单位
是文档
,在elasticsearch中文档有如下几个重要属性:
尽管我们可以随意的新增或者忽略某个字段,但是,每个字段的类型非常重要,比如一个年龄字段类型,可以是字符串也可以是整形。因为elasticsearch会保存字段和类型之间的映射及其他的设置。这种映射具体到每个映射的每种类型,这也是为什么在elasticsearch中,类型有时候也称为映射类型。
2、类型(表)
类型是文档的逻辑容器
,就像关系型数据库一样,表格是行的容器
。elasticsearch会自动的将新字段加入映射,但是这个字段不确定它是什么类型,elasticsearch就开始猜,如果这个值是18,那么elasticsearch会认为它是整形。
但是elasticsearch也可能猜不对,所以最安全的方式就是提前定义好所需要的映射,这点跟关系型数据库殊途同归了,先定义好字段,然后再使用。
3、索引(库)
索引是映射类型的容器, elasticsearch中的索引是一个非常大的文档集合。 索引存储了映射类型的字段和其他设置。然后它们被存储到了各个分片上了,我们来研究下分片是如何工作的。
一个分片是一个Lucene索引(一个ElasticSearch索引包含多个Lucene索引) ,本质上一个包含倒排索引的文件目录,倒排索引的结构使得elasticsearch在不扫描全部文档的情况下,就能找到哪些文档包含我们所要查询的关键字
。4、倒排索引(Lucene索引底层原理)
简单的说,倒排索引就是按照我们所查询的关键字再次建立索引,其底层就是依赖Lucene索引根据关键字筛选包含关键字的文档,自动为我们生成新的倒排索引的形式,然后我们根据关键字查询的过程中,就可以直接查询到包含关键字对应的文档,不包含关键字的文档根本不会被检索到,如图所示:
后续我们的操作都是在Kibana的DEV Tools的Consol控制台下完成,基础操作!!!
分词:即把一段中文或者别的语言划分成一个个的关键字,我们在浏览器搜索的时候,浏览器的搜索引擎会把我们输入的关键字进行分词拆分,也会把数据库中或者索引库中的数据文档内容进行分词拆分,然后进行一个个的匹配操作。
不使用IK分词器的情况下,默认的中文分词是将每个字看成一个词,比如你好一宿君
会被分为你
、好
、一
、宿
、君
,这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题。
IK提供了两个分词算法: ik_smart
和ik_max_word
:
ik_smart为最少切分
ik_max_word为最细粒度划分
1、下载对应es版本的ik分词器
2、安装
3、重启ElasticSearch,加载ik分词器插件
4、使用命令查看elasticsearch下的插件列表
对于这句话你好java一宿君
,上述两种分词方式看似没有任何区别,但是这并不是我们想要的结果,我想要的结果是一宿君
这个关键词要组合在一起做为查询条件,因为一宿君
这三个字是我自己定的网名,词典中肯定没有,如果我们想要使用这个关键词怎么办?
elasticsearch-analysis-ik-7.6.1
ik分词插件elasticsearch-analysis-ik-7.6.1/config/IKAnalyzer.cfg.xml
ik分词配置文件一宿君
这个关键词没有,那我们就自己写一个Rest是一种软件架构风格,而不是一种标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
method | url地址 | 描述 |
---|---|---|
PUT(创建,修改) | localhost:9200/索引名称/类型名称/文档id | 创建文档(指定文档id) |
POST(创建) | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
POST(修改) | localhost:9200/索引名称/类型名称/文档id/_update |
修改文档 |
POST(查询) | localhost:9200/索引名称/类型名称/文档id/_search |
查询所有数据 |
GET(查询) | localhost:9200/索引名称/类型名称/文档id | 查询文档通过文档ID |
DELETE(删除) | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
补充说明:
_doc
为类型名。这个时候我们就要用到es-head插件来显示数据了!
可以看出下述索引中只有三个,都是Kibana系统自带的,不要删!
0、字数据类型
字符串类型
32766
个UTF-8类型的字符,可以通过设置ignore_above
指定所支持的字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。数值型
日期类型
te布尔类型
二进制类型
1、创建索引库(PUT和POST)
使用PUT创建,不指定字段类型
如果自己创建的文档字段没有指定类型,那么ElasticSearch就会给我们默认配置字段映射类型
使用PUT创建,指定字段类型
_doc
默认类型(default type),type 在未来的版本中会逐渐弃用,因此产生一个默认类型进行代替
#此处写到索引名称,代表该索引下所有文档的如下三个字段都是指定的类型
#默认类型为_doc(类型是唯一的,不可再创建类型)
PUT /index2
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age":{
"type": "long"
},
"birthday":{
"type": "date"
}
}
}
}
2、获取数据(GE和POST)
3、扩展:通过get _cat/
可以获取ElasticSearch的当前的很多信息!
GET _cat/indices
GET _cat/aliases
GET _cat/allocation
GET _cat/count
GET _cat/fielddata
GET _cat/health
GET _cat/indices
GET _cat/master
GET _cat/nodeattrs
GET _cat/nodes
GET _cat/pending_tasks
GET _cat/plugins
GET _cat/recovery
GET _cat/repositories
GET _cat/segments
GET _cat/shards
GET _cat/snapshots
GET _cat/tasks
GET _cat/templates
GET _cat/thread_pool
4、修改(PUT:老版本和POST:新版本)
老版本
:使用PUT方式,会覆盖原来一整行的数据
,版本version会加1,如果修改的时候有没写到的字段,那么那些字段将会被覆盖掉,也就是在新版本中不会在出现,这样及很容易造成数据丢失(非常不推荐使用)新版本
:使用POST ~/_update
方式,可以单独修改某个字段的值,也可以修改全部字段的值,无论是单个字段还是全部字段的修改,都不是完全覆盖5、删除索引和文档(DELETE)
如果在启动Kibana出现如下错误!!!
Could not create APM Agent configuration: Request Timeout after 30000ms
原因 :elasticsearch内存不足,造成IO读写阻塞
。
在上述4.1、下载安装es处,有解压包目录解释:
介绍下相关目录及其下的文件的作用:
bin:启动文件目录
config:配置文件目录
1og4j2:日志配置文件
jvm.options:java虚拟机相关的配置(默认启动占1g内存,内存不够的话可以自己调整)
elasticsearch.ym1:es的配置文件! 默认9200端口!跨域!
1ib :相关jar包
modules:功能模块目录
plugins:插件目录,eg:ik分词器
注意:
jvm.options:java虚拟机相关的配置(默认启动占1g内存,内存不够的话可以自己调整
此时就是因为你es运行过程中内存不够用,IO阻塞,导致Kibana无法正常连接!
解决此问题有两种方法:
es/config/jvm.options
文件中的JVM运行参数-Xms1g
,将其调整为2g或者更大,根据服务器配置来调。#linux系统下
vim jvm.options
kibana-7.6.1-windows-x86_64/config/kibana.yml
文件#linux系统下直接
vim kibana.yml
上述两种情况任选其一即可,一般是推荐使用第一种方式!!!
PUT /index3/user/1
{
"name": "一宿君",
"age": 21,
"desc": "是个程序员",
"hobby": ["sing","song","emomo"]
}
PUT /index3/user/2
{
"name": "狂神说",
"age": 23,
"desc": "是个语出迅疾的优秀者",
"hobby": ["技术宅","帅","java"]
}
PUT /index3/user/3
{
"name": "法外狂徒张三",
"age": 30,
"desc": "徘徊法律边缘的大哥",
"hobby": ["想犯罪","想搞事","想体验鉴于生活"]
}
关键字 | 作用 |
---|---|
match | 匹配(会使用分词器解析(先分析文档,然后进行查询)) |
_source | 过滤字段(就是只查询我们想要的字段) |
sort | 排序 |
from、size | 分页查询(from代表当前页码,size代表每页数据条数) |
#复杂条件查询(查询匹配)
GET /index3/user/_search
{
"query":{
"match":{
"name":"狂"
}
}
,
"_source": ["name","desc"]
,
"sort": [
{
"age": {
"order": "desc"
}
}
]
,
"from": 0,
"size": 2
}
must
相当于 andshould
相当于 ormust_not
相当于 not (… and …)filter
过滤
gt
:大于gte
:大于等于lt
:小于lte
:小于等于#多条件查询
GET /index3/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "狂"
}
},
{
"match": {
"desc": "的"
}
}
],
"filter": {
"range": {
"age": {
"gte": 1,
"lte": 35
}
}
}
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
match
会使用分词器解析(先分析文档,然后进行查询)#匹配数组
GET /index3/user/_search
{
"query": {
"match": {
"desc": "是个 优大哥"
}
}
}
text
:
支持分词
、全文检索、支持模糊和精确查询,不支持
聚合和排序操作;keyword
:
不支持分词
、直接通过倒排索引查询、支持模糊和精确匹配,支持
聚合、排序操作。ignore_above
指定支持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。PUT /index4/_doc/1
{
"name": "一宿君",
"desc": "是个憨批"
}
PUT /index4/_doc/2
{
"name": "一宿君",
"desc": "是个憨批plus"
}
通过name字段查询
通过desc字段查询:
通过match匹配查询,再次重复上述查询,看结果:
match和term的区别需要自己去悟!!!
默认查询高亮:
GET /index3/_search
{
"query": {
"match": {
"name": "狂"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}