Сброс имени индекса вasticsearch dsl - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь создать ETL, который извлекает из монго, обрабатывает данные и загружает в эластичный. Я буду выполнять ежедневную загрузку, поэтому я решил присвоить своему индексу текущую дату. Это поможет мне для дальнейшей обработки, которую я должен сделать с этим первым индексом. Я использовал dsl guideasticsearch: 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: это должно быть просто проблемой объектно-ориентированного программирования. Извиняюсь за мое невежество по этому вопросу.

1 Ответ

1 голос
/ 08 октября 2019

Возможно, вы могли бы воспользоваться тем, что 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)
...