# Mapping(映射)

**Mapping**

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html)（修改该链接为官网对应的链接）

译文链接 : [http://www.apache.wiki/display/Elasticsearch](http://www.apache.wiki/display/Elasticsearch)（修改该链接为 ApacheCN 对应的译文链接）

贡献者 : @您的名字

## Meta-Fields (元数据字段)

```
每个 document 都有与之相关的元数据，比如 _index，映射 _type 和 _id meta-fields 。当有这些行为时可以定制这些meta-fields创建一个映射类型。
```

**Identity meta-fields **(特性 meta-fields )

 _index     索引文档所属。

_uid          一个复合字段包含 **_type** 和 **_id **组成。

_type        文档的映射类型。

_id            文档的ID。

Document source meta-fields** (文档源 meta-fields )**

`_source`

原始** JSON **表示文档的主体**。**

`_size`

**             _source **字段的大小字节**, mapper-size **提供的插件**。**

Indexing meta-fields(索引 meta-fields )

**_all **

          全方位字段索引所有其他字段的值。

**`_field_names`**

           所有字段的文档包含空值。

**Routing meta-fields** (路由 **meta-fields** )

`_parent`

               用于创建父子两个映射类型之间的关系。

**`_routing`**

**               自定义路由值文档路由到一个特定的 shard 。**

**Other meta-field (其他**meta-field **)**

**`_meta`**

**              特定于应用程序的元数据。**

### `_all`** field**

这个 **_all field** 是一个特殊的全方位连接的所有其他字段的值为一个大的字符串,使用空间作为分隔符,然后分析和索引,但不能存储。这意味着它可以搜索,但不是检索。

**_all field** 字段允许您搜索文件中的值不知道哪个字段包含的值。这使其成为一个有用的选项时,开始使用一种新的数据集。例如:

```
PUT my_index/user/1 
{
  "first_name":    "John",
  "last_name":     "Smith",
  "date_of_birth": "1970-10-24"
}

GET my_index/_search
{
  "query": {
    "match": {
      "_all": "john smith 1970"
    }
  }
}

```

该 _all field 将会包含这些条款 ：[ "john", "smith", "1970", "10", "24" ]

注意

所有的值作为字符串

date_of_birth字段在上面的例子中是被认为是一个日期字段,所以将索引一个术语代表 1970-10-24 00:00:00 **UTC**。**_all field** ,然而,把所有的值作为字符串,所以日期值与三个字符串索引术语:“1970”,“24”,“10”。

重要的是要注意,**_all field** 结合原来自每个字段的值为字符串。它不将从每个字段。

**_all field **字段只是一个文本字段,并接受其他字符串字段接受相同的参数,包括 **analyzer** ,**term_vectors**,**index_options**和存储。

**_all field **字段可能是有用的,尤其是当使用简单探索新的数据过滤。然而,通过连接字段值为一个大的字符串,_all领域失去了区分短字段(更相关的)和长字段(不那么相关)。使用情况下搜索的相关性是很重要的,最好是专门查询单个字段。

**_all field **字段并不是免费的:它需要额外的CPU周期和使用更多的磁盘空间。如果不需要,它可以完全禁用或定制域基础上。

**Using the _all field in queries** (在查询中使用_all字段)

**query_string **和 **simple_query_string **查询查询 **_all field **字段默认情况下,除非另一个字段指定:

```
GET _search
{
  "query": {
    "query_string": {
      "query": "john smith 1970"
    }
  }
}

```

也是一样的吗?q = 参数搜索请求URI(重写内部query_string查询):

```
GET _search?q=john+smith+1970
```

其他的查询，例如 **match** 和 **term** 查询，需要显式地指定 _all field 参考第一个例子。

Disabling the `_all` field（禁用 _all field ）

_all field 可以完全的禁用每种类型通过设置参数** `enabled` to `false`**:

```
PUT my_index
{
  "mappings": {
    "type_1": { 
      "properties": {...}
    },
    "type_2": { 
      "_all": {
        "enabled": false
      },
      "properties": {...}
    }
  }
}
```

*   1\. _all field 在 type_1 中是不可用的。
*   2. _all field 在 type_2 中是完全不可用的。

如果 _all field 是不可用的，这时 URL 搜索请求和 **query_string** 和 **simple_query_string** 将不无法用它来查询(参见使用中的 **_all** 字段查询)。您可以配置与 **index.query **他们使用不同的领域。**default_field **设置:

```
PUT my_index
{
  "mappings": {
    "my_type": {
      "_all": {
        "enabled": false 
      },
      "properties": {
        "content": {
          "type": "text"
        }
      }
    }
  },
  "settings": {
    "index.query.default_field": "content" 
  }
}
```

*   1\. **_all****field** 对 **my_type** 类型是禁用的。
*   2\. **query_string **查询将默认查询内容字段索引。

Excluding fields from `_all (从 _all 排除字段)`

单个字段可以包含或排除从 **_all field** 中用 **include_in_all** 进行设置。

Index boosting and the `_all` field ( 索引提高)

单个字段可以被提高在索引的时候，用 boost 参数。 这个 _all 字段考虑了这些增强:

```
PUT myindex
{
  "mappings": {
    "mytype": {
      "properties": {
        "title": { 
          "type": "text",
          "boost": 2
        },
        "content": { 
          "type": "text"
        }
      }
    }
  }
}
```

1\. 当查询这个 _all 字段时，词起源于标题字段的词是起源于内容字段的2倍。

waring

使用index-time提高_all领域产生重大影响查询性能。更好的解决方案通常是单独查询字段,和可选的查询时间增加。