📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

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_resultstrue默认允许部分结果
search.default_search_timeout60s默认搜索超时

工作原理 #

部分结果处理机制:

┌─────────────────────────────────────────────────────────────────┐
│                    部分结果处理流程                               │
└─────────────────────────────────────────────────────────────────┘

搜索请求(涉及多个分片)
    │
    ├── 分片 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 堆内存不足

应对措施:
    - 修复未分配分片
    - 优化查询性能
    - 增加节点资源
    - 修复脚本错误

注意事项 #

  1. 动态更新:此配置为动态配置,可在线修改
  2. 请求覆盖:可以在查询请求中覆盖此设置
  3. 数据完整性:需要根据业务需求选择
  4. 监控失败:应监控分片失败情况
  5. 用户体验:允许部分结果可提高可用性
  6. 与重试配合:配合重试机制使用