面试题答案
一键面试routing参数的作用
- 数据分布控制:Elasticsearch将索引数据分布在多个分片(shard)上,
routing
参数允许用户自定义文档应该存储到哪个分片。默认情况下,Elasticsearch根据文档的_id
通过哈希算法决定文档存储的分片。但通过routing
参数,可以根据业务逻辑指定特定的分片,实现更精准的数据分布。 - 提升查询性能:在查询时,如果知道文档的
routing
值,可以直接到对应的分片查询,减少查询涉及的分片数量,从而提升查询性能。例如,在多租户应用中,如果每个租户的数据都通过routing
值隔离到特定分片,查询某个租户的数据时就只需查询对应分片,无需遍历所有分片。
适用的业务场景
- 多租户场景:每个租户的数据通过特定的
routing
值存储到不同分片,实现租户数据的物理隔离,提高数据安全性和查询效率。例如,一个SaaS应用,不同租户的订单数据可以按租户ID作为routing
值,存储到不同分片,查询某个租户订单时可快速定位。 - 地理区域划分:如果数据与地理区域相关,如物流包裹信息,可以按地区代码作为
routing
值,将同一地区的包裹信息存储到相同分片,在查询某个地区包裹状态时能快速获取结果。 - 关联数据分组:某些业务中,具有强关联关系的数据希望存储在同一分片,方便批量查询。比如,一个电商应用中,某个订单及其所有订单项数据,可以通过订单ID作为
routing
值,确保订单及其订单项都存储在同一分片,查询订单详情时无需跨分片查询。
正确设置routing参数
- 索引时设置:在使用
index
API创建或更新文档时设置routing
参数。例如,在使用Elasticsearch的REST API时,通过URL参数指定:
PUT /your_index/_doc/your_doc_id?routing=your_routing_value
{
"field1": "value1",
"field2": "value2"
}
在Java客户端中设置:
IndexRequest indexRequest = new IndexRequest("your_index")
.id("your_doc_id")
.source(XContentType.JSON, "field1", "value1", "field2", "value2")
.routing("your_routing_value");
- 查询时设置:在查询时也需要提供相同的
routing
值,以确保查询到正确分片的数据。例如,使用REST API查询:
GET /your_index/_search?routing=your_routing_value
{
"query": {
"match": {
"field1": "value1"
}
}
}
在Java客户端查询时设置:
SearchRequest searchRequest = new SearchRequest("your_index")
.routing("your_routing_value")
.source(new SearchSourceBuilder()
.query(QueryBuilders.matchQuery("field1", "value1")));
需要注意的是,一旦为文档设置了routing
值,后续对该文档的操作(如更新、删除、查询)都应使用相同的routing
值,否则可能无法正确操作到该文档。