对ES官网的reference的翻译,同时也是备忘,ES版本为7.5
下面是正文翻译,附上原文链接
https://www.elastic.co/guide/en/elasticsearch/reference/current/documents-indices.html
==================================================================================================
文档和索引中的数据
ES是一种分布式的文档仓库。与将信息存储为每行每列的数据(类似于mysql数据库那种)不一样,ES存储的是已经被序列化为JSON文档的复杂数据结构。当你在集群内有多个ES节点时,存储的文档分散在集群的各个节点并能够立即从任何一个节点获取到。
当一个文档被存储后,它能够以接近实时的速度(1s内)被索引和全文搜索。ES使用一种叫倒排索引(inverted index)的数据结构支持非常快的全文搜索。倒排索引会列出所有文档中出现的每一个唯一的词并标示出每个词出现的所有文档(类似于这种k-v对:(词1, (doc1, doc2...)), (词2, (doc1, doc2...))...)。
每个索引可以被认为是文档的集合,每个文档可以被认为是字段(fields)的集合,fields是包含你的数据的k-v对。默认的,ES会索引每个字段(field)的数据并且每个被索引的字段都有一个专用的优化过的数据结构。例如,文本字段被存储在倒排索引中,数字和地理相关的字段被存储在BKD树中(attention:不是所有字段都被存在倒排索引里面,可能跟查询方式以及速度有关?)。ES之所以如此快速的原因就在于它能够使用每个字段的数据结构来整合并返回搜索结果。
ES也拥有无模式(schema-less)的能力,这意味着就算不明确规定如何处理文档中可能出现的不同字段,该文档也可以被索引。当动态映射(dynamic mapping)被打开,ES能够自动检测并添加字段到索引中。这种默认行为让索引和探索数据变得简单——只需要开始索引文档,ES会自动检测并且映射布尔值、浮点数、整数、日期和字符串到合适的ES数据类型。
然而,你比起ES更了解你的数据也更明白你自己想要如何使用它。你能够定义控制动态映射的规则并且明确规定映射来完全控制文档中的字段应该如何存储和索引。
定义你自己的映射能够让你:
1)区分全文字符串字段和精确值字符串字段
2)实现特定语言的文本分析
3)优化用于部分匹配(partial matching)的域
4)使用不能被ES自动检测的数据类型,比如geo_point和geo_shape
为了实现不同目的,以不同的方式索引相同的字段通常是有用的。例如,你可能既想索引一个字符串字段作为文本字段来做全文搜索,又想将这个字符串字段索引为keyword字段来对数据进行排序或者聚合。又或者,你想要选择不止一种语言分析器来处理包含用户输入的字符串字段的内容。
在索引时被用于全文本字段(full-text field)的分析链也会用于搜索。当你查询一个全文本字段时,查询的文本在到索引中查找之前会经历相同的分析过程。