Mapping(映射)

Mapping

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

其他的查询,例如 matchterm 查询,需要显式地指定 _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领域产生重大影响查询性能。更好的解决方案通常是单独查询字段,和可选的查询时间增加。