为什么ElasticSearch Java Client索引未来在记录可搜索之前完成?

时间:2015-02-22 23:05:32

标签: elasticsearch elastic4s

我使用elastic4s客户端返回Future以响应索引请求,当该未来完成时,我仍然需要{i} {{}}}才能查询该索引记录。大多数情况下,它恰好是1秒。是否存在我可以更改的弹性搜索设置,以便在未来完成时记录将可用?

我尝试直接使用java客户端Thread.sleep(1000),结果完全相同,我必须调用client.prepareIndex....execute().actionGet();

在将来完成后,我是否可以更改记录准备好的任何设置?

Thread.sleep(1000)

2 个答案:

答案 0 :(得分:3)

听起来您可能不得不等待默认索引刷新间隔才能在查询新索引数据之前发挥作用。 The refresh interval is 1 second by default可以使用以下

进行更改
curl -XPUT localhost:9200/test/_settings -d '{
    "index" : {
        "refresh_interval" : "1s"
    } }'

或者,您可以在including the refresh parameter in the query string of the index operation的索引操作之后刷新分片。这可能比全局更改刷新间隔更有用

curl -XPUT 'http://localhost:9200/{index}/{type}/{id}?refresh=true' -d '{
  "property" : "value"
}'

答案 1 :(得分:0)

Russ的答案是正确的,但我想补充一点关于Scala方面的内容。

执行索引操作时,只要Elasticsearch集群处理完命令,就会完成返回的future。这与文档可用于搜索的时间不同。也就是说,正如Russ指出的那样,1秒后(默认情况下)。

所以你的未来在k完成。您的文档可在k + 1秒内获得。

您可以在创建索引时调整刷新间隔,例如在Elastic4s

create index "myindex" refreshInterval "200ms" mappings ...

在下一个版本中,您可以使用Scala持续时间,例如

create index "myindex" refreshInterval 200.millis mappings ...

但请注意,通过调整太多,您可以删除刷新间隔带来的一些优化。如果你正在做多个索引等,那么看看批量api。 (在Elastic4s中,只需将您的呼叫包裹在bulk(seq)