Elasticsearch:获取索引

时间:2016-10-21 02:34:30

标签: elasticsearch

问:如何获取自上次刷新以来最新的索引size(使用_stats)?

我正在对Elasticsearch集群进行一些性能测试。代码有效:

Create INDEX
Set refresh_interval to -1 (don't refresh while inserting)
Insert 2000 documents into INDEX
Set refresh_interval back to 1 (default)

Force a refresh of INDEX
Get _stats of INDEX (particularly to get the size)

我的理解是,当文档are indexed时,它们首先被插入到ES内存缓冲区中。强制刷新将导致ES为仍位于缓冲区中的文档创建Lucene段。 (还有一些其他情况,文档缓冲区也会变成Lucene段。)

我相信refreshing the index会保证到目前为止可以搜索到的文档。我希望ES可搜索的文档也反映在_stats中。但是,我发现统计信息请求的大小是非确定性不准确的(例如,它可能是520字节而不是23602)。

我已经尝试在_stats调用之前刷新后清理我的进程,并取得了不同的成功。但我想知道是否有一个适当的,一致的解决方案来获取最新的统计数据? (或者,如果我的理解中的某些内容不正确)。

示例

在插入2000个文档后,我立即在Sense中手动(重复)运行_stats并检查结果。有一段时间,大约5秒钟,我会看到:

"primaries": {
  "docs": {
    "count": 2000,
    "deleted": 0
  },
  "store": {
    "size_in_bytes": 520,
    "throttle_time_in_millis": 0

然后(因为ES突然变得与最近的变化一致),我会看到:

"primaries": {
  "docs": {
    "count": 2000,
    "deleted": 0
  },
  "store": {
    "size_in_bytes": 23602,
    "throttle_time_in_millis": 0

只要没有添加新文档,此结果将无限期地持续存在。

1 个答案:

答案 0 :(得分:2)

我认为这与INDEX_STORE_STATS_REFRESH_INTERVAL_SETTING有关,请参阅https://github.com/elastic/elasticsearch/blob/5.1/core/src/main/java/org/elasticsearch/index/store/Store.java#L133-L134

默认为10秒,但您可以通过index.store.stats_refresh_interval更改值。我不知道会引入多少性能开销,所以如果考虑更改值,请仔细测试。

这也用于单元测试,请参阅https://github.com/elastic/elasticsearch/blob/5.1/core/src/test/java/org/elasticsearch/index/store/StoreTests.java#L760