【问题标题】:Reset index name in elasticsearch dsl在elasticsearch dsl中重置索引名称
【发布时间】:2019-10-07 20:03:34
【问题描述】:

我正在尝试创建一个从 mongo 中提取、处理数据并加载到弹性中的 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()

每次我调用“新闻”类时,我都希望有一个新名称。但是,即使我再次加载该类,名称也不会改变(from custom_indices import News)。我知道这只是我在测试时遇到的一个问题,但我想知道如何强制“重置”。实际上,我原本想在循环之前用这一行更改类外的名称:

News.Index.name = "NEW_NAME"

然而,这并没有奏效。我仍然看到类上定义的名称。 有人可以帮忙吗? 非常感谢! PS:这一定只是一个面向对象的编程问题。对我对这个主题的无知表示歉意。

【问题讨论】:

    标签: python elasticsearch elasticsearch-dsl


    【解决方案1】:

    也许你可以利用Document.init()accepts an index keyword argument这一事实。如果您希望自动设置索引名称,您可以在News 类中实现init(),并在您的实现中调用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)
    

    【讨论】:

    • 感谢 jDo。但是我应该如何处理内部类索引中的“名称”。如果我保持原样或使用静态名称仅用于测试,则在调用 News.init() 时,我仍然看到它创建了索引,其名称指示在类索引内部我尝试从索引调用 init 函数,但我没有知道怎么做。
    【解决方案2】:

    您可以在调用 save() 时覆盖索引。

    new_insert.save('processed_news_' + datetime.datetime.now().strftime("%Y%m%d"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-17
      • 2016-05-21
      • 2020-02-14
      • 2019-03-29
      • 2018-07-28
      • 1970-01-01
      • 2019-02-09
      • 2014-09-17
      相关资源
      最近更新 更多