2016-07-22 3 views
1

У меня есть класс, где я пытаюсь установить student_id как _id Поле в . Я имею в виду persistent example из документов elasticsearch-dsl.использовать существующее поле как _id используя elasticsearch dsl python DocType

from elasticsearch_dsl import DocType, String 

ELASTICSEARCH_INDEX = 'student_index' 

class StudentDoc(DocType): 
    ''' 
    Define mapping for Student type 
    ''' 

    student_id = String(required=True) 
    name = String(null_value='') 

    class Meta: 
     # id = student_id 
     index = ELASTICSEARCH_INDEX 

Я привязал установкой id в Meta, но он не работает.

я получаю решение, как переопределение save method и добиваюсь этого

def save(self, **kwargs): 
    ''' 
    Override to set metadata id 
    ''' 
    self.meta.id = self.student_id 
    return super(StudentDoc, self).save(**kwargs) 

я создаю этот объект как

>>> a = StudentDoc(student_id=1, tags=['test']) 
>>> a.save() 

Есть ли прямой способ установить с Meta без переназначения save метода?

+0

Можете ли вы также показать, как вы создаете новый экземпляр «StudentDoc»? – Val

+0

@Val обновил мой вопрос с дополнительной информацией. – Nilesh

+0

@Val, есть ['MetaField'] (https://github.com/elastic/elasticsearch-dsl-py/blob/master/elasticsearch_dsl/document.py#L27), но я не знаю, что будет полезно здесь. – Nilesh

ответ

2

Есть несколько способов, чтобы присвоить идентификатор:

Вы можете сделать это, как этот

a = StudentDoc(meta={'id':1}, student_id=1, tags=['test']) 
a.save() 

Как это:

a = StudentDoc(student_id=1, tags=['test']) 
a.meta.id = 1 
a.save() 

Также обратите внимание, что до ES 1.5, один был способный к specify a field использовать в качестве документа _id (в вашем случае это могло быть student_id), но это было устарело в 1,5, а с этого момента вы должны исправить законно предоставить идентификатор или позволить ES выбрать один для вас.