使用 Django 和 Elasticsearch 索引新对象



我无法让 django 自动索引新创建的对象。

我使用groupby创建了一些自定义数据。

每次创建新模型时,都应为其编制索引。

确实索引了"标题"值,但"标签"值不存在。

因此,我创建了一个手动功能"manual_index"。当我运行它时,"标签"值确实被添加到索引中。但是,此过程必须手动触发。

如何获取每次创建新对象时保存的"标签"值?

我正在使用elasticsearch_dsl

Search.py

class TaskIndex(DocType):
    title = String()
    class Meta:
        index = 'task-index'
def manual_index():
    TaskIndex.init()
    es = Elasticsearch()
    bulk(client=es, actions=(b.indexing() for b in models.Task.objects.all().iterator()))

Models.py

from itertools import groupby
class Tag(models.Model):
    name = models.CharField("Name", max_length=5000, blank=True)
    taglevel = models.IntegerField("Tag level", null=True, blank=True)
class Item(models.Model):
    title = models.CharField("Title", max_length=10000, blank=True)
    tag = models.ManyToManyField('Tag', blank=True)
    def get_grouped_tags(self):
        tag = self.tag.order_by('taglevel')
        grouped_tags = {
            tag_level: [
                { 'name': tag_of_level.name, 'taglevel': tag_of_level.taglevel, }
                for tag_of_level in tags_of_level
            ] for tag_level, tags_of_level
            in groupby(tag, lambda tag: tag.taglevel)
        }
        return grouped_tags
    def indexing(self):
        obj = TaskIndex(
            meta={'id': self.id},
            title=self.title,
            tag=self.get_grouped_tags()
        obj.save()
        return obj.to_dict(include_meta=True)

这里有几个问题,首先你要保存所有内容两次 - 一次在indexing内部(通过调用.save()(,然后在manual_index中。

manual_index中的代码效率更高,绝对应该用于重新索引整个数据集。对于单个模型的创建,您几乎可以按原样使用 indexing 方法并使用 django 的signal框架。只需修改 indexing 方法即可返回 TaskIndex 对象(无需对其调用 .save()!(,并将以下代码的等效项添加到您的models.py中:https://github.com/HonzaKral/es-django-example/blob/master/qa/models.py#L128-L137

在您的代码中,您将只使用 indexing 而不是我的to_search

希望这有帮助,本扎

最新更新