私は 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についても認識していますが、インデックスにエントリを追加するだけでなく、無効なエントリも削除しているため、使用について混乱しています。