Python 如何在elasticsearch dsl中连接两个文档对象?
我正在尝试使用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)
对象(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的inJoin(relations)中的字符串={'question':'answer'})
与索引名相关。因此,在我的示例中是Join(relations={'es-comment':'es person'})
。它们是否需要是同一父对象的子类,在示例中是Post
?不是索引名,只是“类型”作为父类和子类的文档。它们不必是子类,但因为它们最终需要位于同一索引中,因此可能共享一组字段,这是一种更简单、更直接的方法