我在Java API中使用Elasticsearch。
我正在使用大批量插入索引脱机数据,因此我设置了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();
答案 0 :(得分:5)
尽管刷新间隔被禁用,文档可被搜索的原因可能是由于索引缓冲区填满导致lucene段的创建或translog已满,导致lucene段的提交,这使得文档可搜索。
根据文件
默认情况下,Elasticsearch使用内存启发式方法 根据需要自动触发冲洗操作以清除 存储器中。
也可以按如下方式操作索引缓冲区设置。
关于数据如何可搜索和持久,这个article是一个很好的解读。
您还可以查看一位elasticsearch供稿人撰写的SO thread,了解flush vs refresh
之间的详细信息。
您可以使用indices-stats验证所有这些,即验证是否有刷新或刷新
示例:
GET <index_name>/_stats/refresh
GET <index_name>/_stats/flush