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

Nil*_*esh 6 python elasticsearch elasticsearch-dsl

我有课,我尝试在其中设置student_id_id字段. 我指的是来自 elasticsearch-dsl 文档的持久示例

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
Run Code Online (Sandbox Code Playgroud)

我通过设置绑定idMeta但它不起作用。

我得到解决方案作为覆盖save方法,我实现了这个

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

我正在创建这个对象

>>> a = StudentDoc(student_id=1, tags=['test'])
>>> a.save()
Run Code Online (Sandbox Code Playgroud)

有没有直接的方法可以从Meta没有覆盖save方法的情况下进行设置?

Val*_*Val 5

有几种分配id的方法:

你可以这样做

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

像这样:

a = StudentDoc(student_id=1, tags=['test'])
a.meta.id = 1
a.save()
Run Code Online (Sandbox Code Playgroud)

另请注意,在 ES 1.5 之前,可以指定一个字段用作文档_id(在您的情况下,它可能是student_id),但这在 1.5 中已被弃用,从那时起您必须明确提供一个 ID 或让 ES为你选一个。