Elasticsearch自定义路由搜索为何返回非指定路由文档?
问题解答
核心原因
你遇到的现象完全符合逻辑,根源在于你的索引my-index-000001仅包含1个分片(从返回结果的_shards.total:1可以确认)。
Elasticsearch的路由机制是通过哈希路由值,将文档分配到对应分片上。当索引只有1个分片时,所有路由值最终都会映射到这唯一的分片——不管是user1还是user2,它们的文档都存储在同一个分片里。此时搜索时指定routing=user1,ES确实只会查询这个分片,但该分片包含了所有路由的文档,所以符合查询条件的user2文档也会被返回。
解决方法
如果你想严格只获取指定路由的文档,有两种可行方案:
- 在查询中添加路由字段过滤:
在查询语句里增加对_routing字段的匹配,确保仅返回路由值为user1的文档:GET my-index-000001/_search?routing=user1 { "query": { "bool": { "must": [ {"match": {"title": "document"}}, {"term": {"_routing": "user1"}} ] } } } - 创建索引时设置足够的分片数:
确保索引分片数大于1,让不同路由值哈希到不同分片。比如创建索引时指定分片数为5:
这种情况下,PUT my-index-000001 { "settings": { "number_of_shards": 5 } }user1和user2的路由值会被分配到不同分片,搜索指定routing=user1时,只会查询对应的分片,自然不会返回user2的文档。
内容的提问来源于stack exchange,提问作者Bilal Munawar
相关产品推荐
相关产品推荐

