2016-02-17 105 views
3

我正在使用Java API的Elasticsearch。Elasticsearch自動刷新索引index.refresh = -1?

我索引大批量插入離線數據,所以我設置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(); 

回答

4

的文件名,儘管被禁用可能是刷新間隔搜索的原因要麼是由於指數 - 緩衝區填滿導致lucene段或translog的創建被完全解析在提交lucene片段時要麼使得文檔可被搜索。

作爲每文檔

缺省情況下,使用Elasticsearch存儲器啓發式爲了 根據需要,以清除 存儲器自動觸發刷新操作。

此外,索引緩衝區設置可以如下操作。

article是關於數據如何可搜索和持久的一個很好的閱讀。

您還可以查看SO thread由elasticsearch貢獻者之一編寫的flush vs refresh之間的更多詳細信息。

您可以使用indices-stats來驗證這一切即驗證是否有一個沖洗或刷新

例子:

GET <index_name>/_stats/refresh 

GET <index_name>/_stats/flush