ElasticSearch是一个基于 Lucene 的搜索服务器,它提供了一个分布式的全文搜索引擎。是当前流行的企业级搜索引擎,常用于海量数据分析跟站内搜索。
1.Lucene简介
(1)Lucene架构:
文档:索引与搜索的主要数据载体,包含一个或多个字段,存放要写入索引或从索引搜索出来的数据。
字段:文档的一个片段,包括名称跟内容
词项:文本中的某个词
(2)Lucene查询语言:
常见的查询操作符包括:AND OR NOT + -
+:包含操作符后面词项的文档被匹配
-:匹配的文档不能出现-操作符后面的词项
eg: +hello-world 查询包含hello但是不包含world的文档
注意:查询中未使用任何操作符,默认使用OR
Lucene支持两种通配符:?和 * 前者匹配一个字符,后者匹配多个字符
Lucene还支持模糊查询,使用 ~ 字符以及一个紧随其后的整数值
Lucene支持范围查询,方括号[ ]跟花括号{ } eg: price:[10.00 TO 15.00} 大于等于10 小于15
特殊字符处理,通过反斜杠转义 eg:搜索abc"efg , 可以通过abc\"efg查询
2.ElasticSearch简介
(1)基本概念
索引:es将数据存储在一个或多个索引中,内部使用Lucene将数据写入索引或从索引中检索数据。
文档:文档由字段构成,没有固定的模式或结构,es中的文档其实就是一个JSON对象。
类型:es中每个文档都有与之对应的type定义,一个索引中可以存储多种文档类型。
节点:单个es服务实例称为节点。
集群:查询压力超过单机负载时,需要多个节点协同处理,这些节点组成的系统称为集群(cluster)
分片:es将数据散布到多个索引上,这些Lucene索引称为分片(shard)
副本:为每个分片创建冗余的副本,当访问压力过大时单机无法处理所有请求时,可以把副本当做最初的主分片。
(2)工作流程
启动流程:当es节点启动时,使用广播技术发现同一个集群中的其他节点,并与它们连接。
集群中会有一个节点被选为管理节点,负责集群的状态管理以及集群发生变化时做出反应。
故障检测:管理节点会发送ping请求到其他各个节点,然后等待响应。若无响应,则将该节点从集群中移除。
注意事项:建索引只会发生在主分片上,而不是副本上。若某个节点没有主分片,则请求会转发到拥有正确的主分片的节点。
查询分为两个阶段:分散阶段 && 合并阶段(先在分片中查询然后对返回结果进行合并、排序、后续处理)
(3)架构特点
- 合理的默认配置
- 对等架构可以避免单点故障(索引分片自动复制)
- 支持一个索引中存在多种数据结构
- 准实时搜索和版本同步(分布式架构难免存在 查询延迟和数据不同步问题)
参考资料:《深入理解ElasticSearch》