本文主要是介绍介绍elasticsearch中Mapping,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这篇文件介绍elasticsearch中mapping特性。我们会定义其关键术语,并进一步介绍mapping是什么,什么时候指定它,其结构是怎样的以及如何应用到我们的数据中。
Schema是什么
schema翻译为模式
mapping 翻译为映射
模式是一个或多个字段的描述,描述文档的类型以及如何处理文档的不同字段。
在elasticsearch中schema就是mapping,其用于描述在json文档中的字段和数据类型,以及它们在Lucene索引中如何进行索引。因此,在elasticsearch术语中,我们通常将该模式称为映射。
在概念上,elasticsearch服务器包含零个或多个索引。一个索引包含零个或多个类型,其类型又包含零个或多个文档。换句话说:一个文档有一个标识,会属于一个类型,其又会属于一个索引。下图显示在索引my_index中,my_type类型中的文档A、B、X和Y.
上图将类型名为another_type和索引名为another显示出来是为了强调elasticsearch是多库的,其意味着我们可以在单个服务器上存储多个索引和多个类型。
在elasticsearch文档和相关资料中,我们常常看到术语mapping type, 其通常表示在索引内的type名称,例如上图中的my_type和another_type。
当我们在elasticsearch中说到类型,其通常是类型的定义。不要和每个mapping中的type关键字混淆了,该关键字决定了文档中的数据如何由elasticsearch来处理。
什么时候使用自定义的映射
elasticsearch具有无模式的能力,这意味着文档在没有明确提供模式下也能被索引。
如果你不指定映射,则在索引期间检测到文档中的新字段时,elasticsearch将默认会动态生成一个动态映射。然而,这个动态生成的映射需要注意:
- 检测到的类型可能不正确
- 可能会导致不必要的重复。(特别是
_source和_all字段)。 - 对于索引和搜索会使用默认的分词器和设置。
例如:时间戳在json中常常表示为long,但是elasticsearch可能不能将其检测为date字段,从而阻止了date过滤器和facets(the date histogram facet)正常工作。
明确指定模式,我们可以避免上述的问题。
映射看起了像什么?
映射通常作为json提供给elasticsearch,是一种分层结构格式,root是映射应用的类型名称。
Mapping Root
在映射root级别,在类型名称下,elasticsearch支持几个特殊字段来配置如何处理不是要发布文档部分的元数据,例如:其type,id,size和fallback _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_point和ip,其可以分别用于有效索引和搜索地理位置和IPv4地址。使用multi_field类型,我们甚至可以将单个文档字段索引到多个虚拟字段中。我们将在未来的文章中详细说明。
如何提供Mapping
这里有两种方式来提供mapping给elasticsearch。
最常见的方式是在创建索引时:
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
这篇关于介绍elasticsearch中Mapping的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!