ElasticSearch入门篇(一)——简介

刚接触ElasticSearch不久,还处于学习和探索阶段,在刚刚过去的2017年的最后一个月里,我提交了自己的毕业论文,
在姚老师(姚攀的博客)的帮助下,使用ElasticSearch及其搭配的开发工具Kibana以及head实现了一个新闻搜索引擎,
现把这段时间的学习过程和收获从头整理一遍,连载到ElasticSearch入门篇中,
作为给自己的一个总结,也作为对姚老师的一个交代,感谢姚老师这些日子对我的帮助和指导。

首推官方学习文档:https://www.elastic.co/guide/cn/index.html

ElasticSearch是什么

第一次听说这个词还是姚老师对我讲的,那时我对ElasticSearch一无所知,现在我在写我的ElasticSearch学习总结,
有需要更专业的指导的同学可以去访问他的博客(姚攀的博客)或给他留言或购买他写的书。

ElasticSearch是一个基于Lucence构建的分布式的、可扩展的、实时的、开源的全文搜索和数据分析引擎,
也是一个具有良好搜索功能的数据库。从它的定义中就能很好的了解到它的优点。

全文搜索:是指扫描文章中的每一个词,对每一个词建立相应的索引,指明该词出现在哪篇文章中以及出现的频次,
检索时程序就能根据这个索引进行相应的查找,显然这里会涉及到“分词”和“倒排索引”的概念,下面会介绍。

ElasticSearch入门篇(一)——简介

根据https://db-engines.com/en/ranking官方数据可以看出来,ElasticSearch是使用量第一的搜索引擎,所以值得去学习。

Lucence和倒排索引

Lucence是什么:Lucence是一个开源的、高性能的全文搜索引擎工具库,它和ElasticSearch的区别如下:
Lucence只是工具库,用它能够实现搜索功能,但是很多代码需要我们去完成,使用起来非常复杂,
而ElasticSearch是基于Lucence的、用java开发的搜索引擎,它是一个服务,或者说是一款产品,
很多工作它都能帮我们完成而不需要我们去实现,隐藏了Lucence的复杂性。
它们的关系就好像是利用发动机构建一辆汽车。

倒排索引:进行快速的全文搜索的关键是构建倒排索引,Lucence使用倒排索引结构,所以ElasticSearch也使用了倒排索引机制,
通过分词器(需要安装)获取每个单词,然后为这些单词构建一个由“单词”“文档号”构成的列表,
由于这里是根据单词查找它所在的文档,所以称为“倒排”,当然这些工作都不要我们来做,
但是理解搜索的原理非常重要。比如:
文档1:中国南京
文档2:南京今天下雨
文档3:今天需要打伞
则ES构建的倒排索引结构如下:

单词 文档号
中国 1
南京 1,2
今天 2,3
下雨 2
需要 3
打伞 3

当搜索“南京”时,程序会返回文档1和2,当然,实际的分词过程肯定要比上面复杂的多,但是原理就是这样。

相关术语

相比于传统的关系型数据库,ElasticSearch与它们在相关术语上是有区别的,它们的对应关系如下(来自姚攀的博客):

关系型数据库(如MySQL) ElasticSearch
数据库(database) 索引(index)
表(table) 类型(type)
行(row) 文档(document)
列(column) 字段(field)
模式/表结构(schema) 映射(mapping)
索引 倒排索引
INSERT PUT
DELETE DELETE
UPDATE PUT/POST
SELECT GET

上面表格中的对应关系很直接也很简单,事实上也是如此。除此之外,ElasticSearch中还有几个特殊的概念(来自ES官方文档):

节点:一个运行中的 Elasticsearch 实例称为一个 节点。

集群:集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力。
当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。


关于ElasticSearch,我觉得初学阶段了解检索机制及其基本概念就可以了,后续在使用过程中会慢慢对这些概念有自己的领悟。

我心心期盼的2018年终于来了,愿你我都能拥有美好年华。

ElasticSearch入门篇(一)——简介