Elasticsearch Python DSL персистентность
ES Python DSL новичок здесь, я запрашиваю "основной" индекс, используя category, subcategory and topic
и запись выбранного подмножества полей (из результатов) во "вторичный" индекс, оба на aws elasticsearch service
,
Я создал класс отображения, как показано здесь, и прошел через шаги. Но я не могу получить код save
документ для индексации, используя постоянство.
Тем не менее, я могу заставить его работать, создав питона dict
и звонит es_sec.index(index='secondary', doc_type='sec_post', body=doc)
, Я не уверен, что я делаю здесь не так. Я полагаю, мне нужно прикрепить постоянство (отображение) к вторичному индексу и не уверен, как это сделать через DSL
Спасибо за вашу помощь!
# -*- coding:utf-8 -*-
class Post(DocType):
title = Keyword()
created_on = Date()
description = Text(analyzer='snowball')
category = Keyword()
subcategory = Keyword()
class Meta:
index = 'message'
def save(self, ** kwargs):
self.created_at = datetime.now()
return super().save(** kwargs)
def is_published(self):
return datetime.now() > self.created_on
es_host = '<es_host>.es.amazonaws.com'
auth = AWSRequestsAuth(aws_access_key='aws_access_key',
aws_secret_access_key='aws_secret_access_key',
aws_host=es_host,
aws_region='aws_region',
aws_service='es')
# use the requests connection_class and pass in our custom auth class
es_pri = Elasticsearch(host=es_host,
port=80,
connection_class=RequestsHttpConnection,
http_auth=auth,
retry_on_timeout=True)
es_sec = Elasticsearch(host='<sec host>.es.amazonaws.com',
port=80,
connection_class=RequestsHttpConnection,
retry_on_timeout=True)
# e.g. "sports & entertainment", "athletics", "marathon"
def fetch_data(category, subcategory="", affinity=""):
q = category + ' ' +subcategory + ' ' + affinity
if q.strip() is "":
return None
mm = MultiMatch(query=q.strip(), type='best_fields',fields=['tags', 'description','title','message','description'])
s = Search(using=es_client, index="primary") \
.query(mm)
count = s.count()
if count > 255: count = 255
posts = s[0:count].execute()
for j,hit in enumerate(posts):
desc = hits.desc
if len(tags_list) < 1: continue
#this runs OK but don't see documents written to index
Post.init()
sec_post = Post()
sec_post.category = category
sec_post.subcategory = subcategory
sec_post.description = desc
sec_post.created_on = datetime.now()
sec_post.save(using=es_sec,index='secondary') #this doesn't work
sec_post.save() # neither does this work (i.e. doesn't write to the index)
**#this successfully writes the doc to "secondary" index**
doc = {}
doc["category"] = category
doc["subcategory"] = subcategory
doc["description"] = desc
doc["created_on"] = datetime.now()
es_sec.index(index='secondary', doc_type='sec_post', body=doc)
return
cats_list = []
# e.g. cat = "sports & entertainment", "athletics", "marathon"
for i,cat in enumerate(cats_list):
create_sec_doc(cat[0],cat[1],cat[2])