elasticsearch查询后如何select或只检索特定字段?

How to select or retrieve only specific fields after elasticsearch query?

我可以在 elasticsearch 中查询索引。而且,现在我想将数据缩小到一些特定的领域。但是,我不断收到错误。

这是我的查询:

es = Elasticsearch(hosts="myhost", "port":0000)


search_body={
    "bool":{
            "filter":[
                {"exists": {"field": "customer_name"}},
                {"match_phrase": {"city": "chicago"}},
                ]
        }

    }

results = es.search(index="some_index", query=search_body)

到目前为止,我很容易就能得到结果。但是,由于返回的字段太多,我只想在将其转换为数据框之前检索特定字段。我可以将它转换成数据帧然后进行过滤,但这不是最优的。


我尝试将 _sourcefield 方法添加为:

search_body={
    "bool":{
            "filter":[
                {"exists": {"field": "customer_name"}},
                {"match_phrase": {"city": "chicago"}},
                ]
        },
    "_source":{"fields": {"includes":["customer_name", "city", "company", "company_address"] }}
    }

和其他变体,如

"fields": {"includes":["customer_name", "city", "company", "company_address"] }

# or 

"_source":{"includes":["customer_name", "city", "company", "company_address"] }

# and several others.

我不断收到错误消息:

    raise HTTP_EXCEPTIONS.get(status_code, TransportError)(
elasticsearch.exceptions.RequestError: RequestError(400, 'parsing_exception', '[bool] malformed query, expected [END_OBJECT] but found [FIELD_NAME]')

我关注了:

我在这里错过了什么?

从 JSON 看来,您提供的 _source 字段在您的 bool 查询中。相反,你应该像这样构造它:

search_body = {
  "query": {
    "bool": [
      {...}
    ]
   },
   "_source": {
     "includes": [...]
   }
}

(免责声明:我是 Python Elasticsearch 客户端的维护者并为 Elastic 工作)

试试这个:

results = es.search(index="some_index", query=search_body, source_includes=[...])

Code 是最好的文档(有时!)

主要问题是将“search_body”参数作为 bodyquery 传递。

如果我的“search_body”如下所示,我不能将其作为 query 传递,因为查询是我在索引上请求的特定“查询”。在此查询中请求 _source 会使请求格式错误。

search_body={
    "bool":{
            "filter":[
                {"exists": {"field": "customer_name"}},
                {"match_phrase": {"city": "chicago"}},
                ]
        },
    "_source":{"fields": {"includes":["customer_name", "city", "company", "company_address"] }}
    }

这会通过,因为请求实际上作为主体传递,其中包含“查询”和另一个“_source”字段以对数据进行子集化。

es = Elasticsearch(hosts="myhost", "port":0000)

results = es.search(index="some_index", body=search_body)

这将失败,因为我已请求将搜索作为查询并再次请求对数据进行子集化。

es = Elasticsearch(hosts="myhost", "port":0000)

results = es.search(index="some_index", query=search_body)

如果我们的 search_body 为:

,则第二个请求将通过
search_body={
    "bool":{
            "filter":[
                {"exists": {"field": "customer_name"}},
                {"match_phrase": {"city": "chicago"}},
                ]
        }
    }

但为了命名约定,密钥应命名为“query_body”。

query_body={
    "bool":{
            "filter":[
                {"exists": {"field": "customer_name"}},
                {"match_phrase": {"city": "chicago"}},
                ]
        }
    }

并请求为:

es = Elasticsearch(hosts="myhost", "port":0000)

results = es.search(index="some_index", query=query_body)

因此,可以理解 querybody 是在索引上请求数据的两种不同方式。

注意:Python elasticsearch 客户端可能很快就会弃用其请求中的 body 参数。在这种情况下,让我们看看如何对 filtered/queried 数据进行子集化。

希望对其他人有所帮助。