2

새로 생성 된 객체를 자동으로 색인 생성하는 데 문제가 있습니다.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 프레임 워크를 사용할 수 있습니다. (! 거기에 .save()를 호출하지 않고) 그냥 TaskIndex 객체를 반환하는 indexing 방법을 수정하고 models.py에 다음 코드의 상당을 추가 이 https://github.com/HonzaKral/es-django-example/blob/master/qa/models.py#L128-L137

코드에서 방금 대신 내 to_searchindexing을 사용합니다. 이 도움이

희망, Honza

+0

아, 미안, 나는'tag' 객체에 대한 의견을 간과. 문제는 Django 측에서 많은 데이터가 저장되기 전에 '인덱싱'이 트리거된다는 것입니다. 그 주위에는 여러 가지 방법이 있으며 가장 안전한 방법은'm2m_changed' 신호를 사용하는 것입니다 - https://docs.djangoproject.com/en/1.10/ref/signals/#m2m-changed –