【问题标题】:Elasticsearch refreshing index automatically with index.refresh=-1?Elasticsearch 使用 index.refresh=-1 自动刷新索引?
【发布时间】:2016-02-19 00:04:50
【问题描述】:

我正在使用 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));

插入:

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();

查询:

   QueryBuilder query = ...;

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

   SearchHit[] = resp.getHits().getHits();

【问题讨论】:

    标签: java elasticsearch


    【解决方案1】:

    尽管刷新间隔被禁用,但文档仍可搜索的原因可能是由于索引缓冲区已填满导致创建 lucene 段或 translog 已满导致提交 lucene 段,这两种情况都使文档可搜索。

    根据文档

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

    还可以按如下方式操作索引缓冲区设置。

    这个article 是关于数据如何可搜索和持久的好读物。

    您还可以查看由 elasticsearch 贡献者之一撰写的 SO thread 以了解更多详情,请参见 flush vs refresh

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

    例子:

     GET <index_name>/_stats/refresh
    
     GET <index_name>/_stats/flush
    

    【讨论】:

      猜你喜欢
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 2018-10-12
      • 2023-03-10
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多