【问题标题】:How can I return all nested objects using python?如何使用 python 返回所有嵌套对象?
【发布时间】:2021-04-16 10:08:27
【问题描述】:

我编写了一个 Elastic 查询,它将检查条件 (status="APPROVED") 并获取所有 approved_by 对象。

这是我的索引(投资组合):

{
  "settings": {},
  "mappings": {
    "portfolio": {
      "properties": {
        "status": {
          "type": "keyword",
          "normalizer": "lcase_ascii_normalizer"
        },
        "archived_at": {
          "type": "date"
        },
        "approved_by": {
          "id": "text",
          "name":"text"
        }
      }
    }
  }
}

目前我有 60 个对象的状态被批准,所以当我运行查询时,它将显示 60 个对象,但在我的情况下,我只得到一个对象(我调试了代码,总共 60 个对象按预期出现,但是仍然只返回单个对象),请帮助大家。

我的查询:

profiles = client.search(index='portfolio', doc_type='portfolio',
                  scroll='10m', size=1000,
                  body={
                      "query": {"match": {"status": "APPROVED"}}
                   })
sid = profiles['_scroll_id']
scroll_size = len(profiles['hits']['hits'])
while scroll_size > 0:
     for info in profiles['hits']['hits']:
         item = info['_source']
         approved_by_obj = item.get('approved_by')
         if approved_by_obj:
             return (jsonify({"approved_by": approved_by_obj}))

预期的 o/p 格式:

{
    "approved_by": {
        "id": "system",
        "name": "system"
    }
}

【问题讨论】:

    标签: python-3.x loops elasticsearch


    【解决方案1】:

    您只得到一个结果,因为您从循环中返回,有效地完全摆脱了它。

    因此,不要从它返回,而是将找到的 approved_by_object 附加到您选择的列表中,然后返回该 60 成员列表:

    profiles = client.search(index='portfolio', doc_type='portfolio',
                             scroll='10m', size=1000,
                             body={
                                 "query": {"match": {"status": "APPROVED"}}
                             })
    
    sid = profiles['_scroll_id']
    scroll_size = len(profiles['hits']['hits'])
    
    approved_hits_sources = []    # <-- add this
    
    while scroll_size > 0:
        for info in profiles['hits']['hits']:
            item = info['_source']
            approved_by_obj = item.get('approved_by')
            if approved_by_obj:
                approved_hits_sources.append({"approved_by": approved_by_obj})  # <--- append and not return
    
    return jsonify({"approved_hits_sources": approved_hits_sources})
    
    

    【讨论】:

      猜你喜欢
      • 2021-12-10
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      相关资源
      最近更新 更多