Сбросить имя индекса в elasticsearch dsl

Я пытаюсь создать ETL, который извлекает из монго, обрабатывает данные и загружает в эластичный. Я буду выполнять ежедневную загрузку, поэтому я решил назвать свой индекс текущей датой. Это поможет мне для последующей обработки, которую мне нужно сделать с этим первым индексом. Я использовал руководство по elasticsearch dsl: https://elasticsearch-dsl.readthedocs.io/en/latest/persistence.html Проблема, с которой я столкнулся, связана с моим небольшим опытом работы с классами. Я не знаю, как сбросить имя индекса из класса. Вот мой код для класса (custom_indices.py):

from elasticsearch_dsl import Document, Date, Integer, Keyword, Text
from elasticsearch_dsl.connections import connections
from elasticsearch_dsl import Search
import datetime

class News(Document):
    title = Text(analyzer='standard', fields={'raw': Keyword()})
    manual_tagging = Keyword()

    class Index:
        name = 'processed_news_'+datetime.datetime.now().strftime("%Y%m%d")

    def save(self, ** kwargs):
        return super(News, self).save(** kwargs)

    def is_published(self):
        return datetime.now() >= self.processed

И это часть кода, где я создаю экземпляр этого класса:

from custom_indices import News
import elasticsearch
import elasticsearch_dsl
from elasticsearch_dsl.connections import connections
import pandas as pd
import datetime

connections.create_connection(hosts=['localhost'])
News.init()
for index, doc in df.iterrows():
    new_insert = News(meta={'id': doc.url_hashed}, 
                      title = doc.title,
                      manual_tagging = doc.customTags,
                   )
    new_insert.save()

Каждый раз, когда я вызываю класс «Новости», я ожидаю, что у меня будет новое имя. Однако имя не изменится, даже если я снова загружу класс (из custom_indices import News). Я знаю, что это только проблема, с которой я столкнулся при тестировании, но я хотел бы знать, как принудительно выполнить этот «сброс». На самом деле, я изначально хотел изменить имя вне класса с помощью этой строки прямо перед циклом:

News.Index.name = "NEW_NAME"

Однако это не сработало. Я все еще видел имя, определенное в классе. Кто-нибудь может помочь? Большое спасибо! PS: это должно быть просто проблема объектно-ориентированного программирования. Извиняюсь за невежество в теме.


person raul    schedule 07.10.2019    source источник


Ответы (2)


Возможно, вы могли бы воспользоваться тем фактом, что Document.init() принимает аргумент ключевого слова index. Если вы хотите, чтобы имя индекса устанавливалось автоматически, вы можете реализовать init() в классе News и вызвать super().init(...) в своей реализации.

Упрощенный пример (python 3.x):

from elasticsearch_dsl import Document
from elasticsearch_dsl.connections import connections
import datetime


class News(Document):
    @classmethod
    def init(cls, index=None, using=None):
        index_name = index or 'processed_news_' + datetime.datetime.now().strftime("%Y%m%d")
        return super().init(index=index_name, using=using)
person jDo    schedule 07.10.2019
comment
спасибо дждо. Но что мне делать с именем внутри внутреннего класса Index. Если я оставлю как есть или со статическим именем только для тестирования, при вызове News.init() я все еще вижу, что он создает индекс с именем, указанным внутри индекса класса. Я пытался вызвать функцию инициализации из индекса, но я не знаю, как это сделать. - person raul; 08.10.2019

Вы можете переопределить индекс при вызове save() .

new_insert.save('processed_news_' + datetime.datetime.now().strftime("%Y%m%d"))
person 陳俊淵    schedule 01.12.2019