MST
星途 面试题库

面试题:ElasticSearch文档操作中如何优化使用routing参数

在ElasticSearch文档操作时,routing参数可用于自定义文档的路由规则。请阐述routing参数的作用,以及在何种业务场景下使用它能优化文档操作,并且说明如何正确设置routing参数。
41.9万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

routing参数的作用

  1. 数据分布控制:Elasticsearch将索引数据分布在多个分片(shard)上,routing参数允许用户自定义文档应该存储到哪个分片。默认情况下,Elasticsearch根据文档的_id通过哈希算法决定文档存储的分片。但通过routing参数,可以根据业务逻辑指定特定的分片,实现更精准的数据分布。
  2. 提升查询性能:在查询时,如果知道文档的routing值,可以直接到对应的分片查询,减少查询涉及的分片数量,从而提升查询性能。例如,在多租户应用中,如果每个租户的数据都通过routing值隔离到特定分片,查询某个租户的数据时就只需查询对应分片,无需遍历所有分片。

适用的业务场景

  1. 多租户场景:每个租户的数据通过特定的routing值存储到不同分片,实现租户数据的物理隔离,提高数据安全性和查询效率。例如,一个SaaS应用,不同租户的订单数据可以按租户ID作为routing值,存储到不同分片,查询某个租户订单时可快速定位。
  2. 地理区域划分:如果数据与地理区域相关,如物流包裹信息,可以按地区代码作为routing值,将同一地区的包裹信息存储到相同分片,在查询某个地区包裹状态时能快速获取结果。
  3. 关联数据分组:某些业务中,具有强关联关系的数据希望存储在同一分片,方便批量查询。比如,一个电商应用中,某个订单及其所有订单项数据,可以通过订单ID作为routing值,确保订单及其订单项都存储在同一分片,查询订单详情时无需跨分片查询。

正确设置routing参数

  1. 索引时设置:在使用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");
  1. 查询时设置:在查询时也需要提供相同的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值,否则可能无法正确操作到该文档。