配置项作用 #
search.default_allow_partial_results 配置项控制在搜索请求中未指定 allow_partial_results 参数时的默认行为。当查询涉及多个分片时,如果某些分片失败,此配置决定是返回部分结果还是整个查询失败。
配置项类型 #
该配置项为动态配置,可以在运行时通过集群设置 API 进行修改。
默认值 #
true(允许部分结果)
是否必需 #
可选配置项(有默认值)
取值范围 #
true - 允许返回部分结果
false - 不允许部分结果,有分片失败则整个查询失败
配置格式 #
# 默认配置(允许部分结果)
search.default_allow_partial_results: true
# 不允许部分结果
search.default_allow_partial_results: false
相关配置项 #
| 配置项 | 默认值 | 说明 |
|---|---|---|
search.default_allow_partial_results | true | 默认允许部分结果 |
search.default_search_timeout | 60s | 默认搜索超时 |
工作原理 #
部分结果处理机制:
┌─────────────────────────────────────────────────────────────────┐
│ 部分结果处理流程 │
└─────────────────────────────────────────────────────────────────┘
搜索请求(涉及多个分片)
│
├── 分片 1 执行 ✓
├── 分片 2 执行 ✓
├── 分片 3 执行 ✗ (失败)
└── 分片 4 执行 ✓
│
▼
检查 allow_partial_results
│
├── true(允许部分结果)
│ │
│ └── 返回成功分片的结果
│ ├── 返回 3 个分片的数据
│ ├── 标记为部分结果
│ └── 警告: "shard failures"
│
└── false(不允许部分结果)
│
└── 返回失败
├── 整个查询失败
├── 抛出异常
└── 返回分片失败信息
部分结果示例 #
部分结果响应示例:
{
"took": 15,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 4,
"skipped": 0,
"failed": 1
},
"hits": {
"total": 100,
"hits": [...]
},
"failures": [
{
"shard": 2,
"index": "test",
"reason": {
"type": "search_context_missing_exception",
"reason": "No search context found"
}
}
]
}
说明:
- total: 5 个分片
- successful: 4 个成功
- failed: 1 个失败
- 返回部分数据: 4 个分片的结果
使用场景 #
1. 默认配置(推荐) #
search.default_allow_partial_results: true
适用场景:
- 大多数生产环境
- 需要高可用性
- 部分数据比无数据好
- 分布式环境
2. 不允许部分结果 #
search.default_allow_partial_results: false
适用场景:
- 需要完整数据
- 数据准确性要求高
- 可以接受查询失败
- 监控分片健康
3. 请求级别覆盖 #
# 默认允许部分结果
GET /_search
{
"query": { "match_all": {} }
}
# 明确不允许部分结果
GET /_search?allow_partial_results=false
{
"query": { "match_all": {} }
}
推荐设置建议 #
| 场景 | 推荐值 | 说明 |
|---|---|---|
| 生产环境 | true | 高可用性优先 |
| 日志分析 | true | 部分数据可接受 |
| 财务数据 | false | 完整性优先 |
| 实时搜索 | true | 快速响应 |
| 数据统计 | false | 需要准确数据 |
容错策略对比 #
两种容错策略:
允许部分结果 (true):
优点:
✓ 高可用性
✓ 部分数据可用
✓ 不会因个别分片失败而全部失败
缺点:
✗ 数据不完整
✗ 可能影响统计准确性
✗ 需要处理失败信息
不允许部分结果 (false):
优点:
✓ 数据完整性
✓ 统计准确性
✓ 明确的失败信息
缺点:
✗ 可用性降低
✗ 单个分片失败导致全部失败
✗ 用户体验较差
请求级别控制 #
查询请求中的参数控制:
1. 不指定参数(使用默认)
GET /_search
{
"query": { "match_all": {} }
}
→ 使用 default_allow_partial_results 值
2. 明确指定允许
GET /_search?allow_partial_results=true
{
"query": { "match_all": {} }
}
→ 允许部分结果
3. 明确指定不允许
GET /_search?allow_partial_results=false
{
"query": { "match_all": {} }
}
→ 不允许部分结果
动态配置示例 #
# 更改全局默认值
PUT /_cluster/settings
{
"transient": {
"search.default_allow_partial_results": false
}
}
# 恢复默认值
PUT /_cluster/settings
{
"transient": {
"search.default_allow_partial_results": null
}
}
# 查看当前配置
GET /_cluster/settings?filter_path=*.search.default_allow_partial_results
监控建议 #
# 查看当前配置
GET /_cluster/settings?filter_path=*.search.default_allow_partial_results
# 查看分片失败情况
GET /_search
{
"query": { "match_all": {} }
}
# 检查响应中的 _shards.failed 和 failures 字段
# 查看集群健康
GET /_cluster/health
# 查看未分配分片
GET /_cat/shards?v | grep UNASSIGNED
错误处理 #
处理分片失败的最佳实践:
1. 监控失败响应
- 检查 _shards.failed
- 查阅 failures 数组
- 记录失败原因
2. 重试策略
- 对于临时性错误,重试查询
- 指数退避重试
- 限制重试次数
3. 降级策略
- 返回部分数据并警告
- 使用缓存数据
- 返回上次成功的结果
4. 告警机制
- 分片失败率过高时告警
- 自动触发分片修复
- 通知运维人员
配置示例 #
# 场景 1: 高可用性优先
cluster.name: high-availability-cluster
search.default_allow_partial_results: true
# 场景 2: 数据完整性优先
cluster.name: accuracy-cluster
search.default_allow_partial_results: false
# 场景 3: 混合策略
cluster.name: mixed-cluster
search.default_allow_partial_results: true
# 在需要完整性的查询中明确指定:
# GET /_search?allow_partial_results=false
常见分片失败原因 #
导致分片失败的常见原因:
1. 分片未分配
- 节点故障
- 分片正在迁移
- 磁盘空间不足
2. 分片正在恢复
- 节点重启后
- 新副本创建中
3. 查询超时
- 查询太复杂
- 资源不足
4. 脚本错误
- 脚本语法错误
- 运行时错误
5. 内存不足
- 字段数据缓存溢出
- JVM 堆内存不足
应对措施:
- 修复未分配分片
- 优化查询性能
- 增加节点资源
- 修复脚本错误
注意事项 #
- 动态更新:此配置为动态配置,可在线修改
- 请求覆盖:可以在查询请求中覆盖此设置
- 数据完整性:需要根据业务需求选择
- 监控失败:应监控分片失败情况
- 用户体验:允许部分结果可提高可用性
- 与重试配合:配合重试机制使用





