Elasticsearch(030):es中Meta-Fields(元数据类型)之概述(_routing)

1. 概述


先说明此参数在使用一些高级的ES的特性的时候,经常用到,请认真理解。


文档在索引中利用下面的公式路由到特定的分片:shard_num = hash(_routing) % num_primary_shards_routing字段的默认值使用的文档的_id字段。如果存在父文档,则使用文档的_parent编号。

可以通过为每个文档指定一个自定义的路由值来实现自定义的路由方式。

2. 示例与理解

mappping定义和数据插入

PUT example
PUT example/docs/_mapping
{
    "properties": {
        "id": {"type": "long"},
        "name": {"type": "text"}
    }
}
#本文档使用user1其路由值代替其ID。与此同时,获取,删除或更新 文档routing时,需要提供相同的值 
PUT example/docs/1?routing=user1
{
    "id":1, 
    "name": "username1"
}

查询

_routing字段可以在查询、聚合、脚本以及排序的时候访问。如下:

PUT example
PUT example/docs/_mapping
{
    "properties": {
        "id": {"type": "long"},
        "name": {"type": "text"}
    }
}

PUT example/docs/1?routing=user1
{
    "id":1, 
    "name": "username1"
}
PUT example/docs/2?routing=user1
{
    "id":2, 
    "name": "username2"
}
PUT example/docs/3?routing=user2
{
    "id":3, 
    "name": "username3"
}

#查询
GET example/docs/_search
{
    "query": {
        "terms": {
            "_routing": ['user1']
        }
    },
    "aggs": {
        "Routing values": {
            "terms": {
                "field": "_routing",
                "size": 10
            }
        }
    },
    "sort": [
        {
            "_routing": {
                "order": "desc"
            }
        }
    ],
    "script_fields": {
        "Routing values": {
            "script": {
                "source": "doc['_routing']"
            }
        }
    }
}

作用

  • 自定义路由可以降低搜索压力。搜索请求可以仅仅发送到匹配指定的路由值的分片,而不是广播到全部的分片。如下查询就是广播到所有分片的查询:
GET example/docs/_search?routing=user1,user2
{
    "query": {
        "match_all": {}
    }
}

当我们使用自定义路由时,响应的文档的查询,删除或修改文档,都需要提供路由值,而忘记路由值会导致许多不必要的麻烦。而ES也提供了设置,把routing字段作为一个必须传递的参数的配置。

其他的一些高级特性我们将在后续进行讲解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值