使用 PyE 的 Elasticsearch 批量索引

2023-12-13

我有一个简单的 python 脚本,用于索引包含 100 万行的 CSV 文件:

import csv
from pyes import *

reader = csv.reader(open('data.csv', 'rb'))

conn = ES('127.0.0.1:9200', timeout=20.0)

counter = 0
for row in reader:
        try:
                data = {"name":row[5]}
                conn.index(data,'namesdb',counter, bulk=True)
                counter += 1
        except:
                pass

这种方法效果很好,但当我们数量达到数千时,速度就会呈指数级下降。

我猜如果我把索引分成更小的块,ES 会表现得更好。

有没有更有效的方法来做到这一点? sleep() 延迟会有帮助吗?或者有没有一种简单的方法可以通过编程将 csv 分成更小的块?

Thanks.


您可以在创建ES实例时调整批量大小。像这样的东西:

conn = ES('127.0.0.1:9200', timeout=20.0, bulk_size=100)

默认批量大小为 400。也就是说,当您批量收到 400 个文档时,pyes 会自动发送批量内容。如果您想在达到bulk_size之前发送批量(例如:退出之前),您可以调用 conn.flush_bulk(forced=True)

我不确定在每个第 N 个文档处手动刷新索引是否是最好的选择。 Elasticsearch 默认情况下每秒自动执行一次。你能做的就是增加这个时间。像这样的东西:

curl -XPUT localhost:9200/namesdb/_settings -d '{
    "index" : {
        "refresh_interval" : "3s"
    }
}'

或者,您可以手动刷新,就像 Dragan 建议的那样,但在这种情况下,通过将间隔设置为“-1”来禁用 Elasticsearch 的自动刷新可能是有意义的。但你不需要刷新每个X文档,你可以在插入完所有文档后刷新。

更多详细信息请参见此处:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-update-settings.html

请注意,刷新非常昂贵,根据我的经验,您最好选择以下任一方法: - 让 Elastisearch 在后台进行刷新 - 完全禁用刷新并在插入整堆文档后重新启用它

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PyE 的 Elasticsearch 批量索引 的相关文章

随机推荐