ElasticSearch 简介
ElasticSearch 是什么
ElasticSearch 是分布式的搜索和分析引擎。它可以为各种类型的数据提供接近实时的搜索和分析功能,不管是结构化的还是非结构化的文本,数值型数据或者地理位置数据,ElasticSearch 可以有效的存储和索引。
下面列出一些可以使用 ElasticSearch 的场景:
- 给网站或者 APP 添加搜索功能
- 存储和分析日志,系统指标和安全事件数据
- 使用机器学习实时自动化建模数据行为
- 把 ElasticSearch 当做存储引擎自动化业务流程
- 用来做地理位置信息系统(GIS),存储分析空间信息
- 用来做生物信息研究工具
- 等等,总而言之真的很强大
数据存入: 文档和分片
相较于列数据的行存储,ElasticSearch 使用可以被序列化成 JSON 文档的复杂的数据结构,当你有一个有多节点的群时,存储的文档会被分布到集群的每个节点上,每个节点都可以访问到你存储的数据。
当文档被存储在 ElasticSearch 后,你可以在 1 秒钟之内搜索到它。原因是因为它使用一种叫倒排索引的数据结构,倒排索引支持快速的全文搜索。倒排索引会列出文档中出现的每个单词,并且标识单词出现的所有文档。这有有一段维基百科的解释比较清楚的介绍了倒排索引的原理。
以英文为例,下面是要被索引的文本:
T0 = “it is what it is”
T1 = “what is it”
T2 = “it is a banana”
我们就能得到下面的反向文件索引:“a”: {2}
“banana”: {2}
“it”: {0, 1, 2}
“what”: {0, 1}
检索的条件”what”, “is” 和 “it” 将对应这个集合:{0,1} ⋂ {0,1,2} ⋂ {0,1,2} = {0,1}。对相同的文字,我们得到后面这些完全反向索引,由文档数量和当前查询的单词结果组成的的成对数据。 同样,文档数量和当前查询的单词结果都从零开始。所以,”banana”: {(2, 3)} 就是说 “banana”在第三个文档里 T2 ,而且在第三个文档的位置是第四个单词(地址为 3)。
“a”: {(2, 2)}
“banana”: {(2, 3)}
“is”: {(0, 1), (0, 4), (1, 1), (2, 1)}
“it”: {(0, 0), (0, 3), (1, 2), (2, 0)}
“what”: {(0, 2), (1, 0)}
ElasticSearch 索引每个字段中的所有数据,每个索引字段都有专用的优化数据结构。像刚才提到的文本字段会被存储在倒排索引中,数值和地理位置数据存在 BKD 树中。组装每个字段的数据结构并返回结构的能力就是它速度快的原因了。 这里找到一个腾讯大佬讲 BKD 的博客,有兴趣的可以看看,我只能说我目前看不太懂。
ELasticSearch 具备无模式的能力,这意味着不用显式地指定文档中不同字段的处理方式就可以索引文档。系统会自动检测字段的类型,并为止建立合适的索引。但是一般不建议这么做。因为你自己最熟悉自己要处理的数据,所以最好还是自己指定映射规则。
自己定义映射规则的好处如下:
- 区分全文本字符串和精确值字符串(例如一篇文章和一个单词)
- 执行特定语言的文本分析(这里有一个分析器的概念,比如英语分析器和德语分析器,分词规则不一样)
- 优化字段已进行部分匹配
- 使用自定义的日期格式
- 可以使用不能被自动检测到的数据类型比如说
geo_point
geo_shape
我们通常会遇到一些使用场景,比如说一个字符串字段既想用来做全文搜索也想用来作为排序或聚合数据的关键词,就需要用不同的方法索引一个相同的字段。
输出信息: 搜索和分析
ElasticSearch 强大搜索能力都是基于 Apache Lucene 搜索引擎库。
ElasticSearch 提供了简单易上手的 REST 风格 API 来管理你的节点,索引以及搜索数据。为了方便测试你可以直接从命令行或者使用 Kibana 的开发者控制台发送请求。在应用中可以选择语言所提供的客户端包来使用。
搜索数据
ElasticSearch REST API 提供结构化查询,全文查询或者结合两者的复杂查询。结构化查询类似于 SQL 查询。比如说,你可以在 employee
索引中搜索 gender
和 age
字段,并且可以对匹配到的结果进按照 hire_date
排序。全文索引会找到匹配查询条件的所有文档,并按照匹配度进行排序然后返回结果。比如说,你搜索Elastic
,搜索到的结果有这些 Elastic
Ela
E
,会按照匹配度返回结果。
除了可以进行单项搜索外,还可以进行短语搜索,相似度搜索,前缀搜索以及获取自动补全建议。
ElasticSearch 也可以高效地索引地理空间数据和数值型数据。
分析数据
ElasticSearch 聚合功能赋予构建复杂统计,并深入了解关键指标,模式和趋势的能力。相较于一般的“找到草堆里的一根枕”,聚合可以回答以下几个问题: * 这个草堆里有几根针? * 针的平均长度为多少? * 按制造商分类,针头的中位长度是多少? * 在过去六个月的每个月中,有多少根针被添加到草堆里面?
你也可以用聚合来回答更细微的问题。例如: * 最受欢迎的针的厂商是哪个? * 是否有异常的针?
另外聚合操作伴随搜索请求一起运行。所以我们可以搜索文档,过滤结果,分析同时运行,同样的数据,在一个请求中。因为聚合是在一个特定请求的上下文中进行运算的,所以我们不仅仅展示尺寸为 70 的针的总数,我们是在展示符合我们搜索条件的尺寸为 70 的针的总数,例如所有尺寸为 70 的不粘绣花针。
还有机器学习可以帮忙自动化分析时间序列数据。