gpt4 book ai didi

python - 使用Django和Elasticsearch索引新对象

转载 作者:行者123 更新时间:2023-12-02 22:38:18 26 4
gpt4 key购买 nike

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

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

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

会为索引“title”值,但“tag”值不存在。

因此,我创建了一个手动函数“manual_index”。当我运行该命令时,“tag”值确实会将添加到索引中。但是,此过程必须手动触发。

每次创建新对象时,如何获取要保存的“标签”值?

我正在使用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()))

型号
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

希望这可以帮助,
本za

关于python - 使用Django和Elasticsearch索引新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42151007/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com