ES的底层搜索是 Lucene的倒排索引。
1、维基百科,类似百度百科,全文检索,高亮,搜索推荐
2、The Guardian(国外新闻网站):类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)社交关注看法
3、Stack Overflow(国外的程序异常讨论论坛),IT问题,程序报错,提交上去,全文检索,搜索相关问题的答案。
4、Github,搜索上千亿行代码
5、电商网站,检索商品
6、日志数据分析,logstash采集日志,ES进行复杂的数据分析,ELK技术(ES+Logstash+Kibana)
7、商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户。比如订阅牙膏的价钱一旦低于50块钱,就通知。
8、BI系统,商业智能。比如:有个大型商场集团,BI分析某区域近3年的用户消费金额趋势,以及用户群体的组成构成,产出相关的数据表。ES执行数据分析和挖掘,Kibana进行数据可视化。
9、站内搜索(电商、招聘、门户),IT系统搜索(OA,CRM,ERP),数据分析
9300-9305端口: ES节点之间通讯使用,tcp通讯连接的端口
9200端口: ES节点 和 外部 通讯使用
elasticearch 是一个 基于内存的,分布式可扩展的实时搜索和分析引擎(开发常用)。
其他作用:
1、分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索
2、实时分析的分布式搜索引擎
3、可以扩展到上百台服务器,处理BP级别的结构化或非结构化数据
4、提供了 REST API 接口
位 | 换算单位 |
---|---|
1024B | 1KB |
1024KB | 1MB |
1024MB | 1GB |
1024GB | 1TB |
1024TB | 1PB |
1024PB | 1EB |
1024EB | 1YB |
YB > ZB > EB > PB > TB > GB > MB > KB > B
elasticsearch 是面向文档型的数据库,一条数据在这里就是一个文档。
SQL / NO SQL | ElasitcSearch |
---|---|
数据库(database) | 索引(indices) |
表(tables) | 类型(type) |
行(rows) | 文档 (documents) |
字段(columns) | 字段(fields) |
创建一个索引库,在索引库(库)中创建文档(行)来存储数据,这个文档(行)里有不同的字段,比如名字,性别,年龄(字段,列)。
类型 type 在8.0版本后将被弃用
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 | √ | × |
To | × | × |
every | √ | √ |
forever | √ | √ |
day | √ | √ |
study | × | √ |
good | √ | √ |
every | √ | √ |
to | √ | × |
现在,试图搜索 to forever,只需要查看包含词条的文档
term | doc_1 | doc_2 |
---|---|---|
to | √ | × |
forever | √ | √ |
score(权重) | 2 | 1 |
两个文档都匹配,但是第一个文档比第二个匹配程度更高。如果没有别的条件,现在这两个包含关键字的文档都将返回。
索引是具有相似特性的文档集合。
例如:为客户数据提供索引
为产品目录建立一个索引
为订单数据建立一个索引
索引由小写的名称标识,该名称用于在对中的文档执行索引、搜索、更新和删除操作时引用索引。在单个群集中,您可以定义尽可能多的索引。
文档是索引的基本信息单元。文档用JSON表示。
例如:
{
"_index" : "packtpub", 索引名
"_type" : "elk", 类型淘汰
"_id" : "1", 文档ID
"_version" : 1, 文档版本号
"found" : true,
"_source":{
字段
book_name : "learning elk", 字段1:book_name
book_author:"鲁迅" 字段2:鲁迅
}
}
{
"name": "孙海铭"
"age": 21
"sex": "男"
"bridge": "19990131"
}
{
"mappings": {
"properties": {
"name": {
#字段
"type": "text" #字段类型
},
"age": {
"type": "long"
}
}
}
}
ES 集群的概念,将一个索引数据,分片到各个节点存储
中文分词,咋分词,比如你叫张三。把张三设置成一个词,按照这个词来索引。就叫分词。
主分片在每个节点上都有,每个主分片都具备一个副分片
复制分片通常驻留在一个不同的节点上,在故障转移和负载平衡的情况下,可以满足多个请求。
节点 | 功能 |
---|---|
Master主节点 | 集群主节点干啥的还用解释码,引导集群,接收数据请求,然后将数据向从节点分片存储。 |
Data节点(2个) | 数据节点,也是从节点,主要用来存储数据。 |
Head-web | ElasticSearch的webUI页面,必须要有的插件,一般在 Master节点部署 |
ik分词器 | 一个中文分词器,ES默认不支持中文分词,一般在 Master节点部署 |
kibana | 提供强大的 开发工具,展示工具,所有数据的展示页面,搜索数据关键字 |
集群是一个或多个节点(服务器)的集合,它们共同保存你的整个数据,并提供跨所有节点的联合索引和搜索功能。一个集群由一个唯一的名称标识,默认这个唯一标识的名是"elasticsearch"。这个名称很重要,因为如果节点被设置为按其名称加入集群,那么节点只能是集群的一部分。
确保不要在不同的环境中用相同的集群名称,否则可能导致节点加入到错误的集群中。例如,你可以使用"logging-dev", “logging-test”, "logging-prod"分别用于开发、测试和正式集群的名字。
节点是一个单独的服务器,它是集群的一部分,存储数据,并参与集群的索引和搜索功能。就像集群一样,节点由一个名称来标识,默认情况下,该名称是在启动时分配给节点的随机通用唯一标识符(UUID)。如果不想用默认的节点名,可以定义任何想要的节点名。这个名称对于管理来说很重要,因为你希望识别网络中的哪些服务器对应于你的Elasticsearch集群中的哪些节点。
一个节点可以通过配置集群名称来加入到一个特定的集群中。默认情况下,每个节点都被设置加入到一个名字叫"elasticsearch"的集群中,这就意味着如果你启动了很多个节点,并且假设它们彼此可以互相发现,那么它们将自动形成并加入到一个名为"elasticsearch"的集群中。
一个集群可以有任意数量的节点。此外,如果在你的网络上当前没有运行任何节点,那么此时启动一个节点将默认形成一个单节点的名字叫"elasticsearch"的集群。
1、客户端选择一个 node 发送请求过去,这个 node 就是 coordinating node(协调节点)。
2、coordinating node 对 document 进行路由,将请求转发给对应的 node(有 primary shard 主分片)。
3、实际的 node 上的 primary shard 处理请求,然后将数据同步到 replica node,同步到其复制分片上。
4、coordinating node 如果发现 primary node 和所有 replica node 都搞定之后,就返回响应结果给客户端。
1、客户端发送请求到任意一个 node,成为 coordinate node。
2、coordinate node 对 doc id 进行哈希路由,将请求转发到对应的 node,此时会使用 round-robin随机轮询算法,在 primary shard 以及其所有 replica 中随机选择一个,让读请求负载均衡。
3、接收请求的 node 返回 document 给 coordinate node。
4、coordinate node 返回 document 给客户端。
ES最强大的是做全文检索,比如有三条数据:
1.北京哪里好玩
2.北京是中国的首都
3.北边有一个京都
根据 北京 关键词来搜索,将包含北京的document给搜索出来。
ES就会给你返回:北京哪里好玩,北京是中国的首都。
1、客户端发送请求到一个coordinate node。
2、协调节点将搜索请求转发到所有的shard 对应的 primary shard 或 replica shard,都可以。
3、query phase:每个 shard 将自己的搜索结果(其实就是一些 doc id)返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果。
4、fetch phase:接着由协调节点根据 doc id 去各个节点上拉取实际的 document 数据,最终返回给客户端。