2

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) 

Antwort

0

gibt es mehrere Probleme hier, zunächst von euch alles zweimal sparend sind - einmal im Inneren indexing (durch Aufruf .save()) und dann in manual_index.

Der Code in manual_index ist viel effizienter und sollte definitiv vorhanden sein, um den gesamten Datensatz neu zu indizieren. Für die individuelle Modellerstellung können Sie einfach die indexing Methode verwenden und djangos signal Framework verwenden. Gerade ändern Sie die indexing Methode, um die TaskIndex Objekt zurückzugeben, und das entspricht dem folgenden Code in Ihr models.py hinzufügen (ohne .save() darauf ruft!): https://github.com/HonzaKral/es-django-example/blob/master/qa/models.py#L128-L137

In Ihrem Code, den Sie gerade indexing anstelle von mir to_search verwenden.

hoffe, das hilft, Honza

+0

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 –

Verwandte Themen