使用elasticsearch dsl python DocType将现有字段用作_id

时间:2016-07-22 19:27:10

标签: python elasticsearch elasticsearch-dsl

我上课了,我尝试将student_id设置为中的_id字段。我指的是来自elasticsearch-dsl docs的persistent example

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方法?

1 个答案:

答案 0 :(得分:4)

有几种方法可以分配ID:

你可以这样做

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使用Fetching the max value from ROWS in pentaho作为文档_id(在您的情况下,它可能是student_id),但这已被弃用在1.5之后,你必须明确提供一个ID或让ES为你挑选一个。