本文主要是介绍介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!