Elasticsearch使用index.refresh = -1自动刷新索引?

dap*_*hez 4 java elasticsearch

我正在使用Elasticsearch和Java API.

我正在使用大批量插入索引离线数据,所以我设置了 index.refresh=-1

我不会在任何地方"手动"刷新索引.

看来,刷新在某些时候做,因为做的查询返回的数据.没有返回数据的唯一情况是我只用几个文档进行测试,并且在插入后立即进行查询(使用相同的Client对象).

我想知道在某个阶段Elasticsearch或Java库是否隐式调用索引刷新,即使是在index.refresh=-1什么时候?

或者如何解释这种行为呢?

客户端生成:

Client client = TransportClient.builder().settings(settings)
        .build()
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(address),port));
Run Code Online (Sandbox Code Playgroud)

插入:

BulkRequestBuilder bulkRequest = client.prepareBulk();

for (MyObject object : list) {
    bulkRequest.add(client.prepareIndex(index, type)
            .setSource(XContentFactory.jsonBuilder()
                    .startObject()
                    // ... add object fields here ...
                    .endObject()
            ));
}

BulkResponse bulkResponse = bulkRequest.get();
Run Code Online (Sandbox Code Playgroud)

查询:

   QueryBuilder query = ...;

   SearchResponse resp = client.prepareSearch(index)
            .setQuery(query)
            .setSize(Integer.MAX_VALUE)
            // adding fields here 
            .get();

   SearchHit[] = resp.getHits().getHits();
Run Code Online (Sandbox Code Playgroud)

kee*_*ety 5

尽管刷新间隔被禁用,文档可搜索的原因可能是由于索引缓冲区填满导致lucene段的创建或translog已满,导致lucene段的提交,其中任一项使得文档可搜索.

根据文档

默认情况下,Elasticsearch使用内存启发式方法,以便根据需要自动触发刷新操作以清除内存.

索引缓冲区设置也可以按如下方式进行操作.

文章是关于数据是如何搜索和持久良好的阅读.

您还可以查看由elasticsearch贡献者之一编写的此SO线程,以获取更多详细信息flush vs refresh.

您可以使用indices-stats来验证所有这些,即验证是否存在刷新或刷新

示例:

 GET <index_name>/_stats/refresh

 GET <index_name>/_stats/flush
Run Code Online (Sandbox Code Playgroud)