4

私はpythonでdslPythonでドライバーを使用します。

私のスクリプトは以下の通りです。

import time
from elasticsearch_dsl import DocType, String
from elasticsearch import exceptions as es_exceptions
from elasticsearch_dsl.connections import connections

ELASTICSEARCH_INDEX = 'test'

class StudentDoc(DocType):
    student_id = String(required=True)
    tags = String(null_value=[])

    class Meta:
        index = ELASTICSEARCH_INDEX

    def save(self, **kwargs):
        '''
        Override to set metadata id
        '''
        self.meta.id = self.student_id
        return super(StudentDoc, self).save(**kwargs)

# Define a default Elasticsearch client
connections.create_connection(hosts=['localhost:9200'])

# create the mappings in elasticsearch
StudentDoc.init()

student_doc_obj = \
    StudentDoc(
        student_id=str(1),
        tags=['test'])

try:
    student_doc_obj.save()
except es_exceptions.SerializationError as ex:
    # catch both exception raise by elasticsearch
    LOGGER.error('Error while creating elasticsearch data')
    LOGGER.exception(ex)
else:
    print "*"*80
    print "Student Created:", student_doc_obj
    print "*"*80


search_docs = \
    StudentDoc \
    .search().query('ids',
                    values=["1"])
try:
     student_docs = search_docs.execute()
except es_exceptions.NotFoundError as ex:
    LOGGER.error('Unable to get data from elasticsearch')
    LOGGER.exception(ex)
else:
    print "$"*80
    print student_docs
    print "$"*80

time.sleep(2)

search_docs = \
    StudentDoc \
    .search().query('ids',
                    values=["1"])
try:
     student_docs = search_docs.execute()
except es_exceptions.NotFoundError as ex:
    LOGGER.error('Unable to get data from elasticsearch')
    LOGGER.exception(ex)
else:
    print "$"*80
    print student_docs
    print "$"*80

このスクリプトでは、作成StudentDoc時に同じドキュメントにアクセスしようとしています。レコードでempty行うと、応答が得られます。search

出力

********************************************************************************
Student Created: {'student_id': '1', 'tags': ['test']}
********************************************************************************
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
<Response: []>
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
<Response: [{u'student_id': u'1', u'tags': [u'test']}]>
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

saveコマンドを実行してデータを保存してから、searchtat データを返さないのはなぜですか。22 回目のスリープの後、データを返します。:(

curlコマンド、同じ出力で同じことを試みました。

echo "Create Data"
curl http://localhost:9200/test/student_doc/2 -X PUT -d '{"student_id": "2", "tags": ["test"]}' -H 'Content-type: application/json'

echo
echo "Search ID"
curl http://localhost:9200/test/student_doc/_search -X POST -d '{"query": {"ids": {"values": ["2"]}}}' -H 'Content-type: application/json'
echo

データをelasticsearchに保存するのに遅延はありますか?

4

1 に答える 1

7

はい。新しいドキュメントにインデックスを付けると、インデックスが更新されるまで使用できません。ただし、いくつかのオプションがありますが、主なものは次のとおりです。

A.保存直後と検索前に、基になる接続を使用しrefreshてインデックスを作成できます。teststudent_doc_obj

connections.get_connection.indices.refresh(index= ELASTICSEARCH_INDEX)

B.ドキュメントは完全にリアルタイムで更新を待つ必要がないためget、ドキュメントを検索する代わりに検索できます。get

student_docs = StudentDoc.get("1")

refresh同様に、curl を使用して、PUT 呼び出しにクエリ文字列パラメーターを追加するだけです。

echo "Create Data"
curl 'http://localhost:9200/test/student_doc/2?refresh=true' -X PUT -d '{"student_id": "2", "tags": ["test"]}' -H 'Content-type: application/json'

または、ID でドキュメントを取得することもできます

echo "GET ID"
curl -XGET http://localhost:9200/test/student_doc/2
于 2016-07-26T02:36:25.947 に答える