映射的最顶层被称为根对象。它包含了以下几个部分:
<1>属性区域,列举了文档中包含的每个字段的映射信息。
<2>元数据字段:各种元数据字段,它们都以”_“开头,包括:_index _type _id _version _score _source
<3>控制用于新字段的动态探测的设置,如analyzer,dynamic_date_formates和dynamic_templates。
<4>其它的可以用在根对象和object类型中的字段上的设置,如enabled,dynamic和include_in_all.
属性:
文档字段或者属性中最为重要的三个设置:
<1>type:字段的数据类型,比如string和date
<2>index:一个字段是否需要被当做全文进行搜索(analyzed),被当做精确值来进行搜索(not_analyzed)
<3>analyzer:全文字段在索引时(Index time)和搜索时(search time)使用的analyzer。
元数据:_source字段
默认情况下,ES会将表示文档正文的JSON字符串保存为_source字段。和其它存储的字段一样,_source字段也会在保存到磁盘之前被压缩。
这个功能几乎是总被需要,因为它意味着:
<1>完整的文档在搜索结果中直接就是可用的,不需要额外的请求来得到完整的文档。
<2>_source字段让部分请求成为可能------------搜索结果如果不需要文档中的全部字段的时候,可以选择其中的几个字段进行显示
<3>当映射发生变化需要对数据进行重新索引的时候,可以直接在ES当中完成,而不需要从另外一个数据存储当中获取文档。
<4>调试结果更容易,因为可以清楚的看到每个文档中包含的内容,而不需要对一个ID列表来对文档的内容进行猜测。
_source字段的存储肯定会占用大量的存储空间,当以上的各种优点对你的项目没有任何帮助的时候,可以禁用_source字段。
禁用_source字段的方法:
PUT /my_index
{
"mappings": {
"my_type": {
"_source": {
"enabled": false
}
}
}
}
在一个搜索请求当中,你可以只要求返回部分字段,通过在请求正文当中指定_source参数:
GET /_search
{
"query": { "match_all": {}},
"_source": [ "title", "created" ]
}
这些字段的值会从_source字段当中提取出来并返回,而不是完整的_source。
元数据:_all字段
他是一个特殊的字段,将其他所有字段的值当做一个大的字符串进行索引。query_string查询语句在没有指定特定查询字段的时候 ,默认就是对_all字段进行搜索。
当你对文档的最终结构还不确定的时候,可以应用_all字段进行搜索。
GET /_search
{
"match": {
"_all": "john smith marketing"
}
}
_all字段可以通过下面的映射设置来禁用:
PUT /my_index/_mapping/my_type
{
"my_type": {
"_all": { "enabled": false }
}
}
可以使用include_in_all字段来对每个字段进行设置,是否需要将它包含在_all字段当中,默认值是true。在一个对象设置include_in_all会改变其中所有字段的默认设置。
如果你只需要将部分字段添加到_all字段中,可以将include_in_all默认设置为对所有字段禁用,然后对你选择的字段启用:
PUT /my_index/my_type/_mapping
{
"my_type": {
"include_in_all": false,
"properties": {
"title": {
"type": "string",
"include_in_all": true
},
...
}
}
}
值得注意的地方是,_all字段也是一个被解析过的string字段。它使用默认的解析器来进行解析,无论来源字段中设置的是什么解析器。和任何string字段一样,你也可以配置_all字段应该使用的解析器:
PUT /my_index/my_type/_mapping
{
"my_type": {
"_all": { "analyzer": "whitespace" }
}
}
元数据:文档ID
和文档ID相关的有四个元数据字段:
<1>_id:文档的字符串ID
<2>_type:文档的类型
<3>_index:文档的索引
_id字段有一个比较重要的设置:path,他用来告诉ES,文档应该从某个字段当中抽取一个值来作为自身的_id
PUT /my_index
{
"mappings": {
"my_type": {
"_id": {
"path": "doc_id"
},
"properties": {
"doc_id": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}