Elasticsearch内核解析 - 查询篇

2020-05-22 00:00:00 查询 都是 请求 返回 阶段

在上一篇《Elasticsearch内核解析 - 写入篇》中,我们介绍了Elasticsearch的写入流程。这一篇,我们会介绍Elasticsearch查询流程。

我们仍然先从Elasticsearch的两个身份:NoSQL和Search领域的查询区别说起。

读操作

实时性和《Elasticsearch内核解析 - 写入篇》中的“写操作”一样,对于搜索而言是近实时的,延迟在100ms以上,对于NoSQL则需要是实时的。

一致性指的是写入成功后,下次读操作一定要能读取到新的数据。对于搜索,这个要求会低一些,可以有一些延迟。但是对于NoSQL数据库,则一般要求好是强一致性的。

结果匹配上,NoSQL作为数据库,查询过程中只有符合不符合两种情况,而搜索里面还有是否相关,类似于NoSQL的结果只能是0或1,而搜索里面可能会有0.1,0.5,0.9等部分匹配或者更相关的情况。

结果召回上,搜索一般只需要召回满足条件的Top N结果即可,而NoSQL一般都需要返回满足条件的所有结果。

搜索系统一般都是两阶段查询,个阶段查询到对应的Doc ID,也就是PK;第二阶段再通过Doc ID去查询完整文档,而NoSQL数据库一般是一阶段就返回结果。在Elasticsearch中两种都支持。

目前NoSQL的查询,聚合、分析和统计等功能上都是要比搜索弱的。

Lucene的读

Elasticsearch使用了Lucene作为搜索引擎库,通过Lucene完成特定字段的搜索等功能,在Lucene中这个功能是通过IndexSearcher的下列接口实现的:

public TopDocs search(Query query, int n);
public Document doc(int docID);
public int count(Query query);
......(其他)

相关文章