【问题标题】:How to avoid index for every document in elasticsearch bulk API如何避免在弹性搜索批量 API 中为每个文档编制索引
【发布时间】:2018-05-01 03:01:15
【问题描述】:

我正在使用 curl 使用批量 API 将 apache logrows 作为文档添加到 elasticsearch。我发布以下内容:

{"index": {"_type": "apache", "_id": "123", "_index": "apache-2017-01"}}
{"s": 200, "d": "example.se", "@t": "2017-01-01T00:00:00.000Z", "p": "/foo"}
{"index": {"_type": "apache", "_id": "124", "_index": "apache-2017-01"}}
{"s": 200, "d": "example.se", "@t": "2017-01-01T00:00:00.000Z", "p": "/bar"}
... more of the same ...

我的猜测是,对于每个 logrow 文档行,lucene 索引都会更新它的索引。但我不需要 elasticsearch 来做到这一点。我可以先添加 all logrow 文档,然后再更新索引。

这可能吗?这是个好主意吗?它会大大提高性能吗?

【问题讨论】:

  • 批量 API 的全部意义在于以一种有效的方式执行一堆索引/删除操作。您为什么怀疑 Elasticsearch 效率低下?

标签: curl elasticsearch lucene


【解决方案1】:

你的直觉离事实不远。默认 ElasticSearch will update its index every second:

默认 index.refresh_interval 为 1s,强制 Elasticsearch 每秒创建一个新段。增加这个值(也就是说, 30s)将允许更大的段刷新并减少未来的合并 压力。

因此,增加索引吞吐量的一种方法是增加这个index.refresh_interval,甚至可能增加到无穷大,然后在完成插入后重新打开它。 (请注意,插入的文档只有在段关闭后才可用于搜索,即写入已完成。)

然而,在将文档插入 ElasticSearch 时,这并不是唯一可能的瓶颈。例如,您可以考虑使用多个线程批量插入文档,或者在 ElasticSearch 文档的Tune for index speed 部分中描述的其他调整。您可以在Dynamic Index Settings 部分查找您可能想要更改的其他索引参数。

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 2015-12-18
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    相关资源
    最近更新 更多