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

    当一个文档被存储时,它会被索引,并且可以在1秒内被完全实时搜索到。Elasticsearch使用一种称为反向索引的数据结构,支持非常快速的全文搜索。反向索引列出任何文档中出现的每个唯一单词,并标识每个单词所在的所有文档。

    可以将索引看作是文档的优化集合,每个文档都是字段的集合,字段是包含数据的 key-value 对。默认情况下,Elasticsearch对每个字段中的所有数据进行索引,每个索引字段都有一个专用的优化数据结构。例如,文本字段存储在反向索引中,数字和地理字段存储在BKD树中。使用每个字段的数据结构来组装和返回搜索结果的能力是Elasticsearch如此快速的原因。

    Elasticsearch还具有无模式的能力,这意味着可以对文档进行索引,而无需显式地指定如何处理文档中可能出现的每个不同字段。启用动态映射后,Elasticsearch将自动检测并向索引添加新字段。这种默认行为使您可以轻松地对数据进行索引和研究——只要开始索引文档,Elasticsearch就会检测布尔值、浮点值和整数值、日期和字符串,并将它们映射到适当的Elasticsearch数据类型。

    但是,最终,您比Elasticsearch更了解您的数据以及如何使用它。您可以定义规则来控制动态映射,并显式定义映射来完全控制字段的存储和索引方式。

    定义你自己的映射可以使你:

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

    为不同的目的以不同的方式索引相同的字段通常是有用的。例如,您可能希望将字符串字段作为全文搜索的文本字段和作为排序或聚合数据的关键字字段建立索引。或者,您可以选择使用多个语言分析器来处理包含用户输入的字符串字段的内容。

    在索引期间应用于全文字段的分析链也在搜索时使用。当您查询全文字段时,在索引中查找术语之前,查询文本将进行相同的分析。