如何在elasticsearchdsl中联接两个文档对象?

2024-09-28 01:24:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用elasticsearch dsl在两个索引文档之间创建一个“关系”。当使用Object(EsPerson)作为EsComment的字段时。当我更新EsPerson时,EsComment中的字段不会更新。在

我尝试过使用InnerDoc,但它没有索引,也没有更新

class EsPersonAttr(InnerDoc):
    id = Long(required=True)
    name = Text(fields={'keyword': Keyword()}, required=True)

    def __repr__(self):
        return '<EsPersonAttr: {}>'.format(
            self.name,
        )

class EsPersonIndex(Document):
    """
    Elastic Search Person model.
    """
    class Index:
        name = 'es-person'

    class meta:
        doc_type = 'es-person'

    id = Long(required=True)
    name = Text(fields={'keyword': Keyword()}, required=True)

    def save(self, **kwargs):
        return super(EsPersonIndex, self).save(**kwargs)

    def __repr__(self):
        return '<EsPersonIndex: {}>'.format(
            self.name,
        )


class EsPerson(object):
    def __init__(self, id, name):
        self._id = id
        self._name = name

        self.index_doc = EsPersonIndex(
            id=id,
            name=name
        )

        self.attr_doc = EsPersonAttr(
            id=id,
            name=name
        )

    def __repr__(self):
        return '<EsPerson: {}>'.format(
            self._name,
        )

    @property
    def id(self):
        return self._id

    @id.setter
    # Set both Document & InnerDoc at the same time
    def id(self, value):
        self._id = value

        # self.index_doc.id = value
        self.index_doc.update()

        self.attr_doc.id = value

    @property
    def name(self):
        return self._id

    @name.setter
    # Set both Document & InnerDoc at the same time
    def name(self, value):
        self._name = value

        self.index_doc.name = value
        self.index_doc.save()

        self.attr_doc.name = value


class EsComment(Document):
    """
    Elastic Search Comment model.
    """
    id = Long(required=True)
    title = Text(fields={'keyword': Keyword()}, required=True)
    text = Text(fields={'keyword': Keyword()})
    author = Object(EsPersonAttr, required=True)

    class Index:
        name = 'es-comment'

    class meta:
        doc_type = 'es-comment'

    def save(self, **kwargs):
        # if there is no date, use now
        return super(EsComment, self).save(**kwargs)

    def __repr__(self):
        return '<EsComment: {}>'.format(
            self.title,
        )

我希望当我更新EsPerson的name字段时,它会更新作者姓名在评论中


Tags: nameselfidtrueindexdocreturnvalue

热门问题