2

我無法讓django自動索引新創建的對象。使用Django和Elasticsearch爲新對象編制索引

我已經使用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) 

回答

0

有幾個問題在這裏,首先要保存一切兩次 - 一次內部indexing(通過呼叫.save()),然後在manual_index

manual_index中的代碼是更有效的方式,肯定應該用於重新索引整個數據集。對於創建個人模型,您可以使用indexing方法,並使用django的signal框架。只需修改indexing方法返回TaskIndex對象,並添加以下代碼相當於到您的models.py(不要求它.save()!): https://github.com/HonzaKral/es-django-example/blob/master/qa/models.py#L128-L137

在你的代碼將只使用indexing,而不是我的to_search

希望這有助於 洪扎

+0

哦,對不起,我忽略了對'tag'對象的評論。問題在於,在Django方面,'索引'在保存多對多數據之前觸發。有幾種方法,最安全的是也使用'm2m_changed'信號 - https://docs.djangoproject.com/en/1.10/ref/signals/#m2m-changed –

相關問題