数据输入:文档和索引
Elasticsearch 是一种分布式文档存储。Elasticsearch 不用列数据行存储信息,而是存储已序列化为 JSON 文档的复杂数据结构。当集群中有多个 Elasticsearch 节点时,存储的文档将分布在集群中,且可以从任何节点直接访问。
当一个文档被存储时,它会被索引并且在接近实时的1秒钟内被完全可搜索。Elasticsearch 使用一种称之为倒排索引的数据结构,支持非常快的全文搜索。倒排索引列出任何文档中出现的唯一单词,并标识每个单词出现的所有文档。
索引可被认作一种文档的优化集合,且每个文档都是字段的集合,字段是包含你数据的键值对。默认情况下,Elasticsearch 索引每个字段中的所有数据,且每个被索引的字段有一个专用的优化数据结构。例如,文本字段被存储在倒排索引中,数字和地理字段存储在 BKD 树
中。使用每个字段的数据结构来聚集和返回搜索结果是让 Elasticsearch 如此快的原因。
Elasticsearch 也具有无模式能力,这意味着文档无需明确地指定如何处理可能出现中文档中的每个不同的字段,就可以被索引。当启用动态映射后,Elasticsearch 自动检测和向索引中添加新的字段。这个默认行为使索引和浏览你的数据更容易——只需开始索引文档,Elasticsearch 会自动检测和映射布尔值、浮点值和整数值、日期以及字符串到合适的 Elasticsearch 数据类型。
最终,然而你比 Elasticsearch 更了解你的数据以及你想如何使用它们。你能定义控制动态映射规则,而且明确的定义映射以完全控制字段如何存储和索引。
定义你自己的映射使用你能够:
- 区分全文字符串字段和精确值字符串字段
- 执行特定语言的文本分析
- 为部分匹配优化字段
- 使用自定义的日期格式
- 使用无法自动检测的数据类型,如
geo_point
和geo_shape
为不同的目的以不同的方式索引相同的字段,通常是有用的。例如,你可能想索引一个字符串字段,既作为全文搜索的文本字段,也作为用于排序和聚合你的数据的关键字段。或者,你可以选择使用多个语言分析器,用来处理包含用户输入的字符串字段的内容。
用于索引期间的全文字段的分析链,也被用于搜索时。当你查询一个全文字段时,在索引中查询词语(term
)之前,这个查询文本将经历相同的分析。