Data in: documents and indices
Elasticsearch是一个分布式文档存储器。Elasticsearch将复杂的数据结构序列化为JSON文档来存储,而不是存储为列数据行;当一个集群中有多个Elasticsearch节点时,存储的文档会被分布于集群中的各个节点且能快速获取;
存储的文档会被索引且几乎可以实时检索(大概1秒以内)。Elasticsearchsh使用倒排索引inverted index的数据结构来支持快速的全文搜索;倒排索引列举所有文档中唯一的单词且标识出每个单词出现的所有文档;
索引index可被视为文档document的优化集合,而文档document就是包含数据的键值对集合。默认情况下,Elasticsearch索引每个字段field的所有数据且每个索引都有专用的优化的数据结构;比如:text字段被存储在倒排索引中,数值和地图字段被存储在BKD树中;Elasticsearch如此快速的原因就是它有能力利用每个字段的数据结构来收集和返回查询结果;
Elasticsearch还可以做到schema-less,意思就是在不明确指定怎么处理文档中不同字段的情况下将文档进行索引。当允许动态映射时,Elasticsearch会自动检测并将新字段添加到索引中。对于刚开始建立索引的文档,这个默认的设置使得索引及探索数据变得轻松,Elasticsearch会检测并将booleans,浮点数,整数,日期,字符串等映射到一个合适的Elasticsearch数据类型中;
最后要说的是,比起Elasticsearch,你更了解你的数据以及想怎么去使用它。你可以自己定义规则来控制动态映射或者明确定义映射关系来完全掌控每个字段存储及索引的方式;
定义你自己的映射关系可以让你做到:
- 区分纯文本字符串fields和精确值字符串fields
- 针对特定语言进行文本分析
- 优化部分匹配的fields
- 使用如geo_point, geo_shape这些不能被自动检测的数据类型
出于不同目的,以不同的方式索引同一字段通常很有用。比如,你可能想索引一个字符串字段,即作为一个全文本搜索的文本字段,也作为一个排序和聚合数据的关键字。或者你可能想使用多种语言分析器来处理用户输入的字符串字段内容;
在索引时应用于全文full-text的分析链也适用于搜索, 当你查询一个full-text字段,查询与文本索引前经历着同样的分析过程;