介绍elasticsearch中Mapping

35 篇文章 1 订阅
35 篇文章 1 订阅

这篇文件介绍elasticsearch中mapping特性。我们会定义其关键术语,并进一步介绍mapping是什么,什么时候指定它,其结构是怎样的以及如何应用到我们的数据中。

Schema是什么

schema翻译为模式
mapping 翻译为映射

模式是一个或多个字段的描述,描述文档的类型以及如何处理文档的不同字段。

elasticsearchschema就是mapping,其用于描述在json文档中的字段和数据类型,以及它们在Lucene索引中如何进行索引。因此,在elasticsearch术语中,我们通常将该模式称为映射

在概念上,elasticsearch服务器包含零个或多个索引。一个索引包含零个或多个类型,其类型又包含零个或多个文档。换句话说:一个文档有一个标识,会属于一个类型,其又会属于一个索引。下图显示在索引my_index中,my_type类型中的文档ABXY.

Indexes,types and documents

上图将类型名为another_type和索引名为another显示出来是为了强调elasticsearch多库的,其意味着我们可以在单个服务器上存储多个索引和多个类型。

elasticsearch文档和相关资料中,我们常常看到术语mapping type, 其通常表示在索引内的type名称,例如上图中的my_typeanother_type
当我们在elasticsearch中说到类型,其通常是类型的定义。不要和每个mapping中的type关键字混淆了,该关键字决定了文档中的数据如何由elasticsearch来处理。

什么时候使用自定义的映射

elasticsearch具有无模式的能力,这意味着文档在没有明确提供模式下也能被索引。

如果你不指定映射,则在索引期间检测到文档中的新字段时,elasticsearch将默认会动态生成一个动态映射。然而,这个动态生成的映射需要注意:

  1. 检测到的类型可能不正确
  2. 可能会导致不必要的重复。(特别是_source_all字段)。
  3. 对于索引和搜索会使用默认的分词器和设置。

例如:时间戳在json中常常表示为long,但是elasticsearch可能不能将其检测为date字段,从而阻止了date过滤器和facetsthe date histogram facet)正常工作。

明确指定模式,我们可以避免上述的问题。

映射看起了像什么?

映射通常作为json提供给elasticsearch,是一种分层结构格式,root是映射应用的类型名称。

Mapping Root

在映射root级别,在类型名称下,elasticsearch支持几个特殊字段来配置如何处理不是要发布文档部分的元数据,例如:其typeidsizefallback _all field。有关支持的特殊字段的列表,请参阅Mapping Reference右侧列表中的fields

root 对象还可以有其他额外的属性,它可以为类型设置默认索引和搜索分析器,在类型中的日期会自动解析为日期的格式以及动态模板 - 我们将在以后的文章中重新讨论这些属性。除了上述领域,嵌套json文档的root基本和其他映射基本之间没有区别。

Hierarchical Levels 层次级别

每个层次通常定义一个properties设置,对层次中的文档的key进行映射。这个结构是分层的,意味着每个级别下的叶子节点可能包括其子值的properties设置。为了更好理解,思考下面的文档和其映射:
Document:

{
    "name": {
        "first": "John"
    }
}

Mapping:

{
  "my_type" : {
    "properties" : {
      "name" : {
        "properties" : {
          "first" : { "type" : "string" } }
      }
    }
  }
}

虽然映射比文档稍微复杂点,映射的结果清晰的遵循文档的结构,并添加了properties节点。

上面层次:
第一层:key为name这层,归属type
第二层:key为first这层,归属第一层。
所以在设置映射关系时,第一层是被my_type包裹着,第二层是被name这层包裹着,其中它们都是要用properties字段包裹着,表示设置的映射关系。

The type Key

在上面的例子中,我们看到文档字段name.first与其他结构的区别在于它定义了一个type。在叶子层次中使用的type键是为了告诉elasticsearch在文档给定(相同)的层次中如何处理该字段。如果type键被省略, 如非叶子层次类型情况,elasticsearch会假设其为object(对象)类型。

string类型是内置的核心类型之一,elasticsearch支持许多不同的类型,例如:geo_pointip,其可以分别用于有效索引和搜索地理位置和IPv4地址。使用multi_field类型,我们甚至可以将单个文档字段索引到多个虚拟字段中。我们将在未来的文章中详细说明。

如何提供Mapping

这里有两种方式来提供mappingelasticsearch
最常见的方式是在创建索引时:

curl -XPOST ...:9200/my_index -d '{
    "settings" : {
        # .. index settings
    },
    "mappings" : {
        "my_type" : {
            # mapping for my_type
        }
    }
}'

另一种方式是使用Put Mapping API

$ curl -XPUT 'http://localhost:9200/my_index/my_type/_mapping' -d '
{
    "my_type" : {
        # mapping for my_type
    }
}
'

注意:该类型(my_type)在请求路径和请求体中是相同的。
API使我们能够更新现有索引的映射,但是存在潜在的冲突和一些限制。新定义的映射可以添加到现有映射中,并且已有的类型可能会更新他们的配置,但是改变类型将会发生冲突并且是不可接受的。然而可以通过将ignore_conflicts=true作为参数传递给Mapping API,但这样做不能保证产生预期的结果,因为已经索引的文档在使用新映射时不会自动重新索引(类似于插入操作)文档。

因此,在大多数情况下,建议使用Put Mapping API在创建索引时,指定映射。

结束语

现在介绍在elasticsearch模式/映射,并且展示了数据类型层次定义是如何映射的。在后续文章中,我将会更详细讲解关于a workflow I use when I explore new datasets with Elasticsearch.

参考地址:
https://www.elastic.co/blog/found-elasticsearch-mapping-introduction

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值