我正在使用 python 生成大量具有隨機內容的 elasticsearch 檔案,并使用elasticsearch-py對其進行索引。
簡化的作業示例(只有一個欄位的檔案):
from elasticsearch import Elasticsearch
from random import getrandbits
es_client = Elasticsearch('https://elastic.host:9200')
for i in range(1,10000000):
document = {'my_field': getrandbits(64)}
es_client.index(index='my_index', document=document)
_bulk由于這會為每個檔案發出一個請求,因此我嘗試通過使用API發送 1000 個檔案的塊來加速它。但是,到目前為止,我的嘗試都沒有成功。
我對檔案的理解是您可以將迭代傳遞給bulk(),所以我嘗試了:
from elasticsearch import Elasticsearch
from random import getrandbits
es_client = Elasticsearch('https://elastic.host:9200')
document_list = []
for i in range(1,10000000):
document = {'my_field': getrandbits(64)}
document_list.append(document)
if i % 1000 == 0:
es_client.bulk(operations=document_list, index='my_index')
document_list = []
但這會導致
elasticsearch.BadRequestError: BadRequestError(400, 'illegal_argument_exception', '格式錯誤的操作/元資料行 [1], 預期 START_OBJECT 或 END_OBJECT 但找到 [VALUE_STRING]')
uj5u.com熱心網友回復:
好的,似乎我混合了兩個不同的功能:helpers.bulk()和Elasticsearch.bulk(). 兩者都可以用來實作我打算做的事情,但它們的簽名略有不同。
該helpers.bulk()函式接受一個Elasticsearch()物件和一個包含檔案作為引數的迭代。該操作可以指定為_op_type,index,create,delete或之一update。由于_op_type默認為index,我們可以省略它并在這種情況下簡單地傳遞檔案串列:
from elasticsearch import Elasticsearch, helpers
from random import getrandbits
es_client = Elasticsearch('https://elastic.host:9200')
document_list = []
for i in range(1,10000000):
document = {'my_field': getrandbits(64)}
document_list.append(document)
if i % 1000 == 0:
helpers.bulk(es_client, document_list, index='my_index')
document_list = []
這作業正常。
Elasticsearch.bulk()可以交替使用該函式,但操作/操作在此處作為可迭代的一部分是強制性的,并且語法略有不同。這意味著dict我們需要dict指定動作(在本例"index": {}中為 )以及每個檔案的正文,而不是只包含檔案內容。另見_bulk檔案:
from elasticsearch import Elasticsearch
from random import getrandbits
es_client = Elasticsearch('https://elastic.host:9200')
actions_list = []
for i in range(1,10000000):
document = {'my_field': getrandbits(64)}
actions_list.append({"index": {}, "doc": document})
if i % 1000 == 0:
es_client.bulk(operations=actions_list, index='my_index')
actions_list = []
這也很好。
我假設以上兩者都在_bulk內部生成相同的 REST API 陳述句,因此它們最終應該是等價的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/463961.html
