?refresh

编辑

索引更新删除批量 API 支持设置 refresh 来控制此请求所做的更改何时对搜索可见。 以下是允许的值:

空字符串或 true
在操作发生后立即刷新相关的 主分片 和副本分片(不是整个索引),以便更新的文档立即出现在搜索结果中。 这应该 在仔细考虑并验证它不会导致索引和搜索的性能不佳后才进行。
wait_for
等待请求所做的更改通过刷新变得可见,然后再回复。 这不会强制立即刷新,而是等待刷新发生。 Elasticsearch 会自动刷新每 index.refresh_interval (默认为一秒)更改过的分片。 该设置是动态的。 调用 刷新 API 或在任何支持它的 API 上将 refresh 设置为 true 也会导致刷新,从而导致已经运行的带有 refresh=wait_for 的请求返回。
false (默认值)
不执行与刷新相关的操作。 此请求所做的更改将在请求返回后的某个时间点变为可见。

选择使用哪个设置

编辑

除非您有充分的理由等待更改变为可见,否则始终使用 refresh=false (默认设置)。 最简单快捷的选择是从 URL 中省略 refresh 参数。

如果您绝对需要使请求所做的更改与请求同步可见,则必须在对 Elasticsearch 施加更多负载 (true) 和等待更长的响应时间 (wait_for) 之间做出选择。 以下是一些应该为该决策提供依据的要点:

  • 对索引的更改越多,wait_fortrue 保存的工作就越多。 如果索引仅每 index.refresh_interval 更改一次,则它不保存任何工作。
  • true 会创建效率较低的索引结构(微小段),这些结构必须稍后合并为效率更高的索引结构(更大段)。 这意味着 true 的成本在索引时用于创建微小段,在搜索时用于搜索微小段,以及在合并时用于生成更大的段。
  • 切勿连续启动多个 refresh=wait_for 请求。 相反,将它们批量处理为一个带有 refresh=wait_for 的批量请求,Elasticsearch 将并行启动所有请求,并在它们全部完成时才返回。
  • 如果刷新间隔设置为 -1,禁用自动刷新,则带有 refresh=wait_for 的请求将无限期等待,直到某些操作导致刷新。 相反,将 index.refresh_interval 设置为比默认值短的值(如 200ms)会使 refresh=wait_for 更快地返回,但它仍然会生成效率低下的段。
  • refresh=wait_for 仅影响它所在的请求,但是,通过强制立即刷新,refresh=true 将影响其他正在进行的请求。 通常,如果您有一个不希望被干扰的正在运行的系统,那么 refresh=wait_for 是一个较小的修改。

refresh=wait_for 可以强制刷新

编辑

如果在该分片上已经有 index.max_refresh_listeners (默认为 1000) 个请求等待刷新时,收到 refresh=wait_for 请求,则该请求的行为就像将 refresh 设置为 true 一样:它将强制刷新。 这保证了当 refresh=wait_for 请求返回时,其更改对搜索可见,同时防止阻塞请求的资源使用不受限制。 如果请求由于用完了监听器槽而强制刷新,则其响应将包含 "forced_refresh": true

批量请求在它们触及的每个分片上仅占用一个槽,无论它们修改分片的次数是多少。

示例

编辑

这些将创建一个文档并立即刷新索引,使其可见

resp = client.index(
    index="test",
    id="1",
    refresh=True,
    document={
        "test": "test"
    },
)
print(resp)

resp1 = client.index(
    index="test",
    id="2",
    refresh=True,
    document={
        "test": "test"
    },
)
print(resp1)
response = client.index(
  index: 'test',
  id: 1,
  refresh: true,
  body: {
    test: 'test'
  }
)
puts response

response = client.index(
  index: 'test',
  id: 2,
  refresh: true,
  body: {
    test: 'test'
  }
)
puts response
const response = await client.index({
  index: "test",
  id: 1,
  refresh: "true",
  document: {
    test: "test",
  },
});
console.log(response);

const response1 = await client.index({
  index: "test",
  id: 2,
  refresh: "true",
  document: {
    test: "test",
  },
});
console.log(response1);
PUT /test/_doc/1?refresh
{"test": "test"}
PUT /test/_doc/2?refresh=true
{"test": "test"}

这些将创建一个文档,而不会执行任何操作使其对搜索可见

resp = client.index(
    index="test",
    id="3",
    document={
        "test": "test"
    },
)
print(resp)

resp1 = client.index(
    index="test",
    id="4",
    refresh=False,
    document={
        "test": "test"
    },
)
print(resp1)
response = client.index(
  index: 'test',
  id: 3,
  body: {
    test: 'test'
  }
)
puts response

response = client.index(
  index: 'test',
  id: 4,
  refresh: false,
  body: {
    test: 'test'
  }
)
puts response
const response = await client.index({
  index: "test",
  id: 3,
  document: {
    test: "test",
  },
});
console.log(response);

const response1 = await client.index({
  index: "test",
  id: 4,
  refresh: "false",
  document: {
    test: "test",
  },
});
console.log(response1);
PUT /test/_doc/3
{"test": "test"}
PUT /test/_doc/4?refresh=false
{"test": "test"}

这将创建一个文档,并等待它对搜索变为可见

resp = client.index(
    index="test",
    id="4",
    refresh="wait_for",
    document={
        "test": "test"
    },
)
print(resp)
response = client.index(
  index: 'test',
  id: 4,
  refresh: 'wait_for',
  body: {
    test: 'test'
  }
)
puts response
const response = await client.index({
  index: "test",
  id: 4,
  refresh: "wait_for",
  document: {
    test: "test",
  },
});
console.log(response);
PUT /test/_doc/4?refresh=wait_for
{"test": "test"}