Ich habe Probleme, django zu bekommen, um neu erstellte Objekte automatisch zu indizieren.Indexieren eines neuen Objekts mit Django & Elasticsearch
Ich habe groupby
verwendet, um einige benutzerdefinierte Daten zu erstellen.
Jedes Mal, wenn ein neues Modell erstellt wird, sollte es indiziert werden.
Es does Index der "Titel" Wert, aber der "Tag" Wert ist nicht da.
Also habe ich eine manuelle Funktion "manual_index" erstellt. Wenn ich das starte, wird der "Tag" -Wert zum Index hinzugefügt. Dieser Prozess muss jedoch manuell ausgelöst werden.
Wie kann ich den Wert "Tag" erhalten, um jedes Mal zu speichern, wenn ein neues Objekt erstellt wird?
Ich verwende 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)
Oh, sorry, übersah ich Ihren Kommentar zum 'tag' Objekt. Das Problem ist, dass auf der Seite von Django die "Indizierung" ausgelöst wird, bevor viele bis viele Daten gespeichert werden. Dafür gibt es mehrere Möglichkeiten, am sichersten ist es, das Signal "m2m_changed" zu verwenden - https://docs.djangoproject.com/en/1.10/ref/signals/#m2m-changed –