元数据:
_all field : 6.0 以后已经被遗弃了, 如果有需要 可以使用copy_to 来实现。
_field_names: _field_names字段用于索引文档中包含除null之外的任何值的每个字段的名称。 存在查询使用此字段来查找具有或不具有特定字段的任何非空值的文档。
现在,_field_names字段仅索引已禁用doc_values和规范的字段的名称。 对于启用了doc_values或norm的字段,exists查询仍然可用,但不会使用_field_names字段。
通常不需要禁用_field_names,因为它不再承载曾经执行过的索引开销。 如果您有许多字段已禁用doc_values和规范,并且您不需要使用这些字段执行存在查询,则可能需要禁用_field_names,请将以下内容添加到映射中。
_id: 每条数据都有一个唯一id。_id字段的值也可以在聚合中进行访问或用于排序,但不鼓励这样做,因为它需要在内存中加载大量数据。 如果需要在_id字段上进行排序或聚合,建议在启用了doc_values的另一个字段中复制_id字段的内容。
_index: 在跨多个索引执行查询时,有时需要添加与仅某些索引的文档关联的查询子句。 _index字段允许在索引文档的索引上进行匹配。 它的值可以通过术语或术语查询,聚合,脚本以及排序时访问:
_index作为虚拟字段公开 - 它不作为真实字段添加到Lucene索引中。 这意味着您可以在术语或术语查询中使用_index字段(或任何重写到术语查询的查询,例如match,query_string或simple_query_string查询),但它不支持前缀,通配符,正则表达式或 模糊查询。
GET _search
{
"query": {
"term": {
"_index": {
"value": "index_1"
}
}
}
}
可以对索引进行查询。
_meta field: 映射类型可以具有与之关联的自定义元数据。 Elasticsearch根本不使用它们,但可以用于存储特定于应用程序的元数据,例如文档所属的类:
PUT my_index
{
"mappings": {
"_doc": {
"_meta": {
"class": "MyApp::User",
"version": {
"min": "1.0",
"max": "1.3"
}
}
}
}
}
PUT my_index/_mapping/_doc
{
"_meta": {
"class": "MyApp2::User3",
"version": {
"min": "1.3",
"max": "1.5"
}
}
}
就是存储一些信息类描述这个索引,使用mapping 可以查询到这些信息。
_routing field:
这个字段决定数据被存储到哪个分片上。
shard_num = hash(_routing) % num_primary_shards
_routing 的默认值 就是数据的_id
PUT my_index/_doc/1?routing=user1&refresh=true
{
"title": "This is a document"
}
GET my_index/_doc/1?routing=user1
因为插入数据时使用了自定义路由,所以在getting, deleting, or updating 数据时routing 必须要被提供。
GET my_index/_search
{
"query": {
"terms": {
"_routing": [ "user1" ]
}
}
}
GET my_index/_search?routing=user1,user2
{
"query": {
"match": {
"title": "document"
}
}
}
这个查询被执行 仅仅和 user1 ,user2 2个有关联的分片上。 不会查询所有的分片。查询速度会更快。
在使用自定义_routing 就不能保证分片的唯一性了。因为可能相同的_id 使用不同的_routing 值进行索引,这样就存储在不同的分片上。 用户应该保证_id在索引中是唯一的。
路由到索引分区(不懂):
可以配置索引,使得自定义路由值将转到分片的子集而不是单个分片。这有助于降低结束不平衡群集的风险,同时仍然可以减少搜索的影响。
这是通过在索引创建时提供索引级别设置index.routing_partition_size来完成的。随着分区大小的增加,数据分布越均匀,代价是每个请求必须搜索更多分片。
当此设置存在时,计算分片的公式变为:
shard_num =(hash(_routing)+ hash(_id)%routing_partition_size)%num_primary_shards
也就是说,_routing字段用于计算索引中的一组分片,然后_id用于选择该集合中的分片。
要启用此功能,index.routing_partition_size应具有大于1且小于index.number_of_shards的值。
启用后,分区索引将具有以下限制:
无法在其中创建具有连接字段关系的映射。
索引中的所有映射都必须将_routing字段标记为必需。
_source: 该字段包含了在索引时传递的原始JSON数据。_source字段本身不能被索引,但是却被存储了,所以在查询时,会返回数据给我们。
尽管非常方便,但是_source字段在索引中增加存储开销。如果需要,可以把它禁用掉:
PUT tweets
{
"mappings": {
"_doc": {
"_source": {
"enabled": false
}
}
}
}
注意:
用户经常在不考虑后果的情况下禁用_source字段,然后生活后悔。 如果_source字段不可用,则不支持许多功能:
update,update_by_query和reindex API。
高亮显示。
能够从一个Elasticsearch索引重新索引到另一个索引,以更改映射或分析,或将索引升级到新的主要版本。
通过查看索引时使用的原始文档来调试查询或聚合的功能。
如果需要考虑磁盘空间,请增加压缩级别,而不是禁用_source。
度量用例与其他基于时间或日志记录的用例不同,因为有许多小文档仅包含数字,日期或关键字。 没有更新,没有突出显示请求,数据快速老化,因此无需重新索引。 搜索请求通常使用简单查询按日期或标记过滤数据集,结果将作为聚合返回。
在这种情况下,禁用_source字段将节省空间并减少I / O. 建议在指标情况下禁用_all字段。
从_source中删除字段与禁用_source有类似的缺点,尤其是您无法将文档从一个Elasticsearch索引重新索引到另一个Elasticsearch索引。 请考虑使用_source filter。
The includes/excludes fields from _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
返回结果:
"hits" : [
{
"_index" : "logs",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"meta" : {
"other" : { },
"name" : "Some metric"
},
"requests" : {
"count" : 10
}
}
}
]
_source 里只要includes里 "*.count", "meta.*" 模糊匹配的字段。
_type filed: 6.0被遗弃。
_uid field: 6.0被遗弃。