ElasticSearch是啥

ElsatciSearch(以下简称ES)是一个基于lucene的搜索引擎。它提供了一个分布式、多租户的全文搜索功能,HTTP Web界面以及自由格式的JSON文档支持。
其他需要补充的知识暂时没列这么多。
TODO: 节点、分片、分片状态(绿色、紫色、灰色等)、lucene简介和使用

背景

了解搜索引擎其实很有必要。说到搜索引擎其实大家都很熟悉,无论是不是技术的。而且很难想象现代网络没有搜索引擎是个什么样的光景。如果能够更加深入地了解搜索引擎,了解其原理和过程,那么你或许能够通过搜索引擎完成别人想不到的工作,相信你能够在网络生活中会如鱼得水。
此文的背景是建立在一个项目基础上。有些内容可能因为业务而做了妥协,不一定是最好的解决方式。而且因为涉及商业,所以有些内容表述测试与表述都不是很完善,望理解。
最后声明,这里说的不一定都是对的。

总体搜索结构

顺序图很好的帮助理解程序流程。只要开始阅读ES源码就可以发现,ES代码逻辑是那么的复杂,也可以说它的设计模式用得很溜。代码里面充斥了各种工厂、父类子类,单单搞清执行流程就不容易,它会在多个类中跳转来跳转去,眼花缭乱。所以,为了理清各个调用之间的关系,本文采用了顺序图表达,在这之后,各种跳转也基本跳不出顺序图标识的各个实体,对理解逻辑发挥了巨大作用。
总体搜索结构:
基本搜索过程
如上图,标示了ES搜索的两个重要操作:查询(Query)与聚合(Aggregation)。

查询

ES的查询过程,实际转化成了每个节点每个分片下的lucene搜索操作。在搜索参数处理完成后,ES就拿到了用于查询的Query、以及对应分片下的IndexSearcher。这两个对象在lucene的样例代码中很常见。最简单的操作,就是调用searcher的查询接口,传入query的参数,就能获得所有符合query条件的docId。然后继续调用searcher的接口,就能获取对应docId的文档,实现对文档的搜索与获取过程。
ES在lucene搜索结果的基础上,做了分布式环境的支持。从请求分发到结果的聚合,ES使得lucene的搜索能力不仅限于单节点上。通过分片、多节点等,lucene需要支持的单个索引量其实并不大,ES很好地发挥了lucene优秀的搜索能力,同时实现了大数据的支持。

聚合

聚合是一个常见的操作,例如对搜索结果统计个数、指定字段分组操作等。正如上面顺序图的展示,在通过查询获得docId后,每个docId都会被聚合对象采集,进行相应的内部操作。
聚合内还包含更多的操作,这部分在这个系列中接着更新。

总结

上述的搜索流程,是ES最核心的躯干。而随着工作越做越细,流程中的各个部分都会越变越复杂。但把握这个躯干对接下来的理解有十分重要的辅助作用。

本文作者:Tobin
本文地址http://www.thirteenyu.com/2016/08/17/es-query-process-1/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!