0

私は ElasticSearch の初心者であり、ElasticSearch ConnectionPool [経由Transport class] からの同時接続を使用して、ElasticSearch のインデックスにエントリを追加しようとしています。

これが私のコードです:

import elasticsearch
from elasticsearch.transport import Transport

def init_connection():
    transport = Transport([{'host':SERVER_URL}], port=SERVER_PORT, randomize_hosts=False)
    transport.add_connection(host=SERVER_URL+SERVER_PORT)
    return transport

def add_entries_to_es(id, name):
    transport = init_connection()
    doc = {
           'name': name,
           'postDate': datetime.datetime.now(),
           'valid': "true",
           'suggest': {
               "input": name,
               'output': name,
               'payload': {'domain_id': id}
               }
           }
    conn = transport.getConnection()
    es = elasticsearch.Elasticsearch(connection_class=conn)
    res = es.index(index=ES_INDEX_NAME, doc_type=ES_DOC_TYPE, id=id, body=doc)
    ...

そして、私は以下のエラーを受け取ります:

File "/my_project/elastichelper.py", line 23, in init_connection
transport.add_connection(host=SERVER_URL+SERVER_PORT)
File "/Library/Python/2.7/site-packages/elasticsearch/transport.py", line 139, in add_connection
self.set_connections(self.hosts)
File "/Library/Python/2.7/site-packages/elasticsearch/transport.py", line 169, in set_connections
connections = map(_create_connection, hosts)
File "/Library/Python/2.7/site-packages/elasticsearch/transport.py", line 161, in _create_connection
kwargs.update(host)
ValueError: dictionary update sequence element #0 has length 1; 2 is required

ElasticSearch でTransport classインスタンス化する正しい方法かどうかはわかりません。ただし、トランスポートクラスが個々の接続のインスタンス化を処理し、それらを保持するための接続プールを作成することをConnectionPoolドキュメントから読みました。

ConnectionPoolをインスタンス化し、プールから接続を効率的に使用する正しい方法がわかりません。読書とグーグルは、私の好意では役に立ちませんでした。

helpers.bulk() APIについても認識していますが、インデックスにエントリを追加するだけでなく、無効なエントリも削除しているため、使用について混乱しています。

4

1 に答える 1

0

メソッドが機能するために、適切な値セットを使用してElasticSearchクラスインスタンスを使用するだけで十分であることがわかりました[私にとっては十分でした] 。このような:timeout timeout=30 index

doc = {
       'name': name,
       'postDate': datetime.datetime.now(),
       'valid': "true",
       'suggest': {
           "input": name,
           'output': name,
           'payload': {'domain_id': id}
           }
       }
es = elasticsearch.Elasticsearch()
res = es.index(index=ES_INDEX_NAME, doc_type=ES_DOC_TYPE, id=id, body=doc, timeout=30)

最初は単純なクラス インスタンスのtimeout問題に直面していましたが、上記の変更によって修正されました。ElasticSearch

インスタンスを明示的に使用Transportまたはクラス化する必要はまったくありません。Connection

于 2016-03-14T09:04:59.103 に答える