面试题答案
一键面试常见场景
- 数据分区与隔离:当数据按照某种业务逻辑进行分区存储时,通过路由参数可以快速定位到特定分区的数据。例如,电商系统中,不同地区的订单数据分别存储在不同的节点上,通过地区编码作为路由参数,可直接查询特定地区的订单。
- 提高写入性能:在写入数据时指定路由参数,可使数据均匀分布到不同节点,避免数据倾斜。比如,以用户ID的哈希值作为路由参数写入用户相关数据,确保数据分散存储。
- 多租户应用:不同租户的数据可通过路由参数进行隔离。每个租户有自己的路由标识,查询时指定租户的路由,只获取该租户的数据。
提高查询效率示例
假设我们有一个博客系统,文章按作者ID进行分区存储。每个作者的文章存储在特定的节点上。
- 创建索引并设置路由
PUT /blog_index
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"title": { "type": "text" },
"content": { "type": "text" },
"author_id": { "type": "keyword" }
}
}
}
- 写入数据时指定路由
POST /blog_index/_doc?routing=123
{
"title": "Elasticsearch Routing Example",
"content": "This is an example of using routing in Elasticsearch",
"author_id": "123"
}
- 查询时指定路由
GET /blog_index/_doc/[document_id]?routing=123
通过在查询时指定路由参数routing=123
,Elasticsearch 无需在所有分片上查找,直接定位到存储作者ID为123文章的分片,大大提高了查询效率。对于范围查询等,同样可以通过路由快速定位到相关分片,减少不必要的查询开销。