Elasticsearch之Mapping Meta-Fields

Meta-Fields

每个文档都有与之关联的元字段,例如_index、_type和 _id 元字段。 创建映射类型时,可以自定义其中一些元字段的行为。

Identity meta-fields(文档标示元字段)

_index

文档所属的索引。

多索引查询时,有时候只需要在特地索引名上进行查询,_index字段提供了便利,也就是说可以对索引名进行term查询、terms查询、聚合分析、使用脚本和排序。

_index是一个虚拟字段,不会真的加到Lucene索引中,对_index进行term、terms查询(也包括match、query_string、simple_query_string),但是不支持prefix、wildcard、regexp和fuzzy查询。

_uid

_type 和_id 的组合

在elasticsearch6及之后弃用。现在,_type类型已被删除,文档由_id唯一标识,_uid字段仅作为查看_id字段以保持向后兼容。

_type

文档的匹配类型。

在elasticsearch6及之后弃用。
索引中的每一份文档都和一个 _type和_id唯一关联。 _type 字段本身的设计目标是为了索引更快查询。可被查询,聚合,排序使用,或者脚本里使用。

_id

文档的id.

每一个文档都有一个独一无二的 _id 标示它, 它被索引存储一遍我们在调用GET API 或者查询ids时能够更快的点位文档。

在elasticsearch6之前因为支持多类型的存在,所以我们在一个索引中唯一标示文档需要同时用到 _type 和 _id,或者用_uid来作为唯一主键,elasticsearch6 及之后_id 就是索引的唯一主键。

Document source meta-fields(原文档元字段)

_source

文档的原生json字符串文档内容。

_source字段包含在索引时间传递的原始JSON文档正文。 _source字段本身没有编入索引(因此不可搜索),但它被存储,以便在执行获取请求(如get或search)时可以返回它。
默认_source字段是开启的,也就是说,默认情况下存储文档的原始值。

禁用_source

如果某个字段内容非常多(比如一篇小说),或者查询业务只需要对该字段进行搜索,返回文档id,然后通过其他途径查看文档原文,则不需要保留_source元字段。可以通过禁用_source元字段,在ElasticSearch 中只存储倒排索引,不保留字段原始值。

PUT tweets
{
  "mappings": {
    "_doc": {
      "_source": {
        "enabled": false
      }
    }
  }
}

包含或者去除 _source 元字段里面的字段

在文档存储之前,我们可以先定义在索引_source存储哪些信息不存储哪些信息
定义映射

PUT logs
{
  "mappings": {
    "_doc": {
      "_source": {
        "includes": [
          "*.count",
          "meta.*"
        ],
        "excludes": [
          "meta.description",
          "meta.other.*"
        ]
      }
    }
  }
}

插入内容

PUT logs/_doc/1
{
  "requests": {
    "count": 10,
    "foo": "bar" 
  },
  "meta": {
    "name": "Some metric",
    "description": "Some metric description", 
    "other": {
      "foo": "one", 
      "baz": "two" 
    }
  }
}
GET logs/_search
{
  "query": {
    "match": {
      "meta.other.foo": "one" 
    }
  }
}

查询结果如下:

{
  "took": 58,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "logs",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "meta": {
            "other": {},
            "name": "Some metric"
          },
          "requests": {
            "count": 10
          }
        }
      }
    ]
  }
}

_size

mapper-size 插件提供的计算整个_source字段的字节数大小 。

Indexing meta-fields(索引元字段)

_all

_all字段是把其它字段拼接在一起的超级字段,所有的字段用空格分开,_all字段会被解析和索引,但是不存储。当你只想返回包含某个关键字的文档但是不明确地搜某个字段的时候就需要使用_all字段。默认是关闭的。

在elasticsearch6及之后弃用。

PUT /my_index
{
  "mapping": {
    "user": {
      "_all": {
        "enabled": true   
      }
    }
  }
}

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 将包含这些索引词:[ "john", "smith", "1970", "10", "24" ],索引次的组合顺序依赖于分词器,_all已弃用。

_field_names

_field_names字段包含索引文档中字段的取值除null以外的任何值每个字段的名称。 一般使用此字段来查找对于特定字段具有或不具有任何非空值的文档。

目前,一般来讲_field_names字段只包含具有doc_values并且默认关闭属性的字段名称。

禁用 _field_names

PUT tweets
{
  "mappings": {
    "_doc": {
      "_field_names": {
        "enabled": false
      }
    }
  }
}

_ignored

elasticsearch 6.4之后添加元字段

_ignored 元字段索引和存储文档中由于ignore_malformed属性被ignored 的每个字段的名称。

Routing meta-field(路由元字段)

_routing
索引中的文档存储在特定的分片使用下面的公式决定:
shard_num = hash(_routing) % num_primary_shards
默认是用的 文档_id元字段的值来路由。

自定义路由模式可以通过指定每个文档的自定义路由值来实现。例如:

PUT my_index/_doc/1?routing=user1&refresh=true 
{
  "title": "This is a document"
}

GET my_index/_doc/1?routing=user1
查询结果

{
  "_index": "my_index",
  "_type": "_doc",
  "_id": "1",
  "_version": 1,
  "_routing": "user1",
  "found": true,
  "_source": {
    "title": "This is a document"
  }
}

请求体查询方式如下:

GET my_index/_search
{
  "query": {
    "terms": {
      "_routing": [ "user1" ] 
    }
  }
}

其他meta-field (自定义元字段)

elasticsearch 也支持自定义元数据。

猜你喜欢

转载自blog.csdn.net/agonie201218/article/details/104538695