elasticsearch-dsl,Python,Python 3.x,elasticsearch Dsl" /> elasticsearch-dsl,Python,Python 3.x,elasticsearch Dsl" />

Python 如何在elasticsearch dsl中连接两个文档对象?

Python 如何在elasticsearch dsl中连接两个文档对象?,python,python-3.x,elasticsearch-dsl,Python,Python 3.x,elasticsearch Dsl,我正在尝试使用elasticsearch dsl在两个索引文档之间创建“关系”。使用对象(EsPerson)作为EsComment的字段时。当我更新EsPerson时,EsComment中的字段不会更新 我尝试过使用InnerDoc,但它没有索引,也不会更新 class EsPersonAttr(InnerDoc): id = Long(required=True) name = Text(fields={'keyword': Keyword()}, required=True)

我正在尝试使用elasticsearch dsl在两个索引文档之间创建“关系”。使用
对象(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,
        )
class Espersonatr(InnerDoc):
id=长(必需=真)
name=Text(字段={'keyword':keyword()},必需=True)
定义报告(自我):
返回“”格式(
姓名,
)
EsPersonIndex类(文件):
"""
弹性搜索人模型。
"""
类别索引:
姓名='es person'
类元:
文件类型='es person'
id=长(必需=真)
name=Text(字段={'keyword':keyword()},必需=True)
def保存(自身,**kwargs):
返回超级(EsPersonIndex,自我)。保存(**kwargs)
定义报告(自我):
返回“”格式(
姓名,
)
类EsPerson(对象):
定义初始化(self、id、name):
self.\u id=id
self.\u name=name
self.index_doc=EsPersonIndex(
id=id,
name=name
)
self.attr_doc=espersonatr(
id=id,
name=name
)
定义报告(自我):
返回“”格式(
我的名字,
)
@财产
def id(自身):
返回自我。\u id
@id设置器
#同时设置文档和内部文档
def id(自身,值):
self.\u id=值
#self.index_doc.id=值
self.index_doc.update()
self.attr_doc.id=值
@财产
def名称(自我):
返回自我。\u id
@姓名设定器
#同时设置文档和内部文档
def名称(自身、值):
self.\u name=value
self.index_doc.name=值
self.index_doc.save()
self.attr_doc.name=值
类别说明(文件):
"""
弹性搜索评论模型。
"""
id=长(必需=真)
title=Text(字段={'keyword':keyword()},必需=True)
text=text(字段={'keyword':keyword()})
author=Object(espersonatr,必需=True)
类别索引:
name='es comment'
类元:
文档类型='es注释'
def保存(自身,**kwargs):
#如果没有日期,请立即使用
返回超级(电子命令,自我)。保存(**kwargs)
定义报告(自我):
返回“”格式(
自封,
)

我希望当我更新一个EsPerson的name字段时,它会更新EsComment中的author.name

您可能希望使用
parent
/
child
nested
查看示例,这两种方法是Elasticsearch中连接对象的两种方法:

是dict的in
Join(relations)中的字符串={'question':'answer'})
与索引名相关。因此,在我的示例中是
Join(relations={'es-comment':'es person'})
。它们是否需要是同一父对象的子类,在示例中是
Post
?不是索引名,只是“类型”作为父类和子类的文档。它们不必是子类,但因为它们最终需要位于同一索引中,因此可能共享一组字段,这是一种更简单、更直接的方法