原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/documents-indices.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/documents-indices.html

数据输入: 文档和索引edit

ElasticSearch是一个分布式文档存储。 Elasticearch 没有将信息存储为一行一行的列数据,而是存储为已序列化为JSON文档的复杂的数据结构。 当一个集群中有多个 Elasticsearch 节点时,存储的文档分布在整个集群中,可以立即从任何节点访问。

当文档被存储时,会被索引,并完全有近实时(near real-time)搜索的能力 - 延迟在1秒以内。 Elasticsearch 使用一个叫做 倒置索引(inverted index) 的数据结构,它支持非常快速的全文搜索。 倒排索引列出文档中的每一个唯一的单词,并标识每个单词出现在哪些文档中。

索引可以看作是一个优化过的文档(document)的集合,每个文档是字段(field, 包含数据的键值对)的集合。 默认情况下,Elasticsearch 索引每个字段中的所有数据,每一个被索引的字段都有一个专用的、优化的数据结构。 比如, 文本(text)字段存储在倒排索引中, 数值(numeric)和地理位置(geo)字段存储在 BKD 树中。 Elasticsearch 之所以这么快, 得益于它能使用每个字段的数据结构来组装数据并返回搜索结果的能力。

ElasticSearch 还具有无模式(schema-less)的能力,这意味着可以直接对文档进行索引,而不必显式地指定如何处理文档中可能出现的每个不同的字段。 当启用了 动态映射(dynamic mapping) 时, Elasticsearch 会自动侦测并添加新的字段到索引中。 这种默认行为使得索引和浏览数据变得容易 --​ 只是开始索引文档,ElasticSearch将检测布尔值、浮点值和整数值、日期和字符串,并将其映射到适当的Elasticsearch数据类型。 这种默认行为使得索引和探索数据变得很容易 —— 你只需开始去索引文档,Elasticsearch 会检测并将布尔值、浮点值和整数值、日期和字符串映射到相应的 Elasticsearch 数据类型。

但是,归根结底,你比 Elasticsearch 更了解数据以及你想如何使用数据。 你可以定义规则来控制 动态映射,并显式地定义映射来完全控制字段的存储和索引方式。

定义自己的映射使你能够:

  • 区分要全文索引的字符串字段和精确匹配的字符串字段
  • 执行特定语言的文本分析
  • 为部分匹配去优化字段
  • 使用自定义的日期格式
  • 使用无法自动检测的数据类型,如geo_pointgeo_shape

为了不同的目的,以不同的方式去索引同一个字段,通常很有用。 例如,您可能希望将字符串字段作为全文搜索的文本字段和用于排序或聚合数据的关键字字段进行索引。 比如,你想将一个字符串字段索引成既可以用于全文搜索的text(文本)字段,又可以索引成用于排序和聚合的keyword(关键字)字段。 或者,您可以选择使用多个语言 分析器(analyzer) 来处理包含用户输入的字符串字段的内容。

全文搜索字段在索引期间使用的分析链,也在搜索时使用。 查询全文搜索字段时,会对查询文本进行相同的分析,把文本拆分成词项(term),然后去索引中查找这些词项(term)。