Объемный индекс Elasticsearch в порциях с использованием PyEs - PullRequest
4 голосов
/ 25 января 2012

У меня есть простой скрипт на Python для индексации CSV-файла, содержащего 1 миллион строк:

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 будет работать лучше.

Есть ли более эффективный способ сделать это?Поможет ли задержка сна ()?или есть простой способ разбить CSV на более мелкие куски программно?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 09 апреля 2012

Вы можете настроить общий размер при создании экземпляра ES. Примерно так:

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

Размер пакета по умолчанию - 400. Таким образом, pyes отправляет пакетное содержимое автоматически, когда вы получили 400 документов. Если вы хотите отправить объем до того, как мы достигли объемного размера (например, перед выходом), вы можете вызвать conn.flush_bulk (принудительный = True)

Я не уверен, что лучше всего было бы обновить индекс вручную для каждого N-го документа. Elasticsearch делает это автоматически по умолчанию каждую секунду. Что вы можете сделать, это увеличить это время. Как то так:

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

Или, вы можете обновить вручную, как предложил Драган, но в этом случае может иметь смысл отключить автоматическое обновление Elasticsearch, установив интервал в «-1». Но вам не нужно обновлять все X-документы, вы можете обновить их после того, как вставите их все.

Подробнее здесь: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-update-settings.html

Обратите внимание, что обновление довольно дорого, и, по моему опыту, вам лучше либо: - позволяя Elastisearch делать обновления в фоновом режиме - отключить обновление и включить его снова после того, как я закончу вставлять весь пакет документов

3 голосов
/ 25 января 2012

на каждом N-м счете

es.refresh()

пример здесь

1 голос
/ 18 октября 2016

Для будущих посетителей Elasticsearch-py поддерживает массовые операции в одном вызове. Обратите внимание, что поле _op_type в каждом документе определяет, какая операция выполняется (по умолчанию index, если она отсутствует)

1009 * Е.Г. *

import elasticsearch as ES
import elasticsearch.helpers as ESH

es = ES.Elasticsearch()
docs = [ doc1, doc2, doc3 ]

n_success, n_fail = ESH.bulk(es, docs, index='test_index', doc_type='test_doc',
                             stats_only=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...