elasticsearch,Python 3.x,elasticsearch" /> elasticsearch,Python 3.x,elasticsearch" />

Python 3.x 如何使用elasticsearch dsl将点击转换为文档?

Python 3.x 如何使用elasticsearch dsl将点击转换为文档?,python-3.x,elasticsearch,Python 3.x,elasticsearch,考虑ES中文档的以下映射 class MyDoc(elasticseach_dsl.Document): id_info = Object(IdInfo) class IdInfo(elasticseach_dsl.InnerDoc): id = Keyword() type = Keyword() 使用elasticsearch dsl,有两种检索文档的方法(我感兴趣): 使用MyDoc.search().query().execute(),生成Hit对象 使用M

考虑ES中文档的以下映射

class MyDoc(elasticseach_dsl.Document):
    id_info = Object(IdInfo)

class IdInfo(elasticseach_dsl.InnerDoc):
    id = Keyword()
    type = Keyword()
使用elasticsearch dsl,有两种检索文档的方法(我感兴趣):

  • 使用
    MyDoc.search().query().execute()
    ,生成
    Hit
    对象
  • 使用
    MyDoc.get()
    ,生成一个
    MyDoc
    对象
以下是我遇到的问题:

当我从ES检索同一文档时,该文档丢失,例如,
type
字段,我会得到不同的行为:

  • 使用
    search()
    doc
    作为
    Hit
    对象时,访问
    doc.type
    会引发
    KeyError
  • 当使用
    get()
    doc
    作为
    MyDoc
    对象时,访问
    doc.type
    只会返回
    None
为了解决这个差异,我想将
Hit
实例转换为
MyDoc
实例,这样我就可以始终使用
doc.type
语法而不会出现任何错误

我该怎么做


或者,是否有一种方法可以访问与
MyDoc
实例具有相同行为的
Hit
实例?

我知道这有点尴尬和烦人,它过去用于6以下的版本

我找到了一个解决方法,如果您使用elasticsearch响应中的字典,那么您可以要求document类如下解释它

query=MyDoc.search()
response=query.execute()
my_doc=MyDoc.from_es(response.hits.hits[0])

请不要只发布代码作为答案,还要解释代码的作用以及如何解决问题。带有解释的答案通常更有帮助,质量更好,更容易吸引选票。
dict_hit = hit.to_dict()
doc = YourDocument(**dict_hit)
doc.property1 # you can access the property here