Elasticsearch注意事项
客观地说,Elasticsearch确实是个好工具,毕竟它在分布式开源搜索和分析引擎中处于领先地位。不过它也存在不少陷阱,以至于身边几个朋友经常抱怨Elasticsearch有多么不好用。
对于Elasticsearch而言,想掌握好这门技术,除需要对它的用法了如指掌 外 , 还 需 要 对 技 术 中 的 各 种 陷 阱 了 然 于 心 。 这 里 总 结 一 些 关 于Elasticsearch的使用要点。
1)如何使用Elasticsearch设计表结构?
2)Elasticsearch的存储结构。
3)Elasticsearch如何修改表结构?
4)Elasticsearch的准实时性。
5)Elasticsearch可能丢数据。
6)Elasticsearch分页。
如果你用过Elasticsearch,这一节学习起来会更容易一些。没使用过也没关系,通过这些要点的展开,也能了解Elasticsearch的基本原理和Elasticsearch的一些陷阱。
很多人在用Elasticsearch时的第一个疑问就是:它跟常用的关系型数据库有什么不同?
如何使用Elasticsearch设计表结构
Elasticsearch是基于索引的设计,它无法像MySQL那样使用join查询,所以查询数据时需要把每条主数据及关联子表的数据全部整合在一条记录中。
比如,MySQL中有一个订单数据,使用Elasticsearch查询时,会把每条主数据及关联子表数据全部整合,见表2-3。
但是,使用Elasticsearch存储数据时并不会设计多个表,而是将所有表的相关字段数据汇集在一个Document中,即一个完整的文档结构,类似下面的示例代码(此处使用JSON):
看到这里,是不是很疑惑:为什么把所有表汇聚在一个Document中,而不是 设 计 成 多 个 表 ? 为 什 么 Elasticsearch 不 需 要 关 联 查 询 ? 这 就 涉 及Elasticsearch的存储结构原理相关知识了。
Elasticsearch的存储结构
Elasticsearch是一个分布式的查询系统,它的每一个节点都是一个基于Lucene的查询引擎。下面通过与MySQL的概念对比来更快地理解Lucene。
1.Lucene和MySQL的概念对比
Lucene是一个索引系统,此处把Lucene与MySQL的一些概念做简单对照,见表2-4。
通过表2-4中相关概念的对比,就能比较容易地理解Lucene中每个概念的作用了。
到这里可能还有一个疑问:Lucene的索引(Index)到底是什么?下面继续介绍。
2.无结构文档的倒排索引
实际上,Lucene使用的是倒排索引的结构,具体是什么意思呢?
先举个例子,假如有一些无结构的文档,见表2-5。
简单倒排索