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)
到目前为止,我很容易就能得到结果。但是,由于返回的字段太多,我只想在将其转换为数据框之前检索特定字段。我可以将它转换成数据帧然后进行过滤,但这不是最优的。
我尝试将 _source
和 field
方法添加为:
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]')
我关注了:
- https://www.elastic.co/guide/en/elasticsearch/reference/current/search-fields.html
- https://www.elastic.co/guide/en/elasticsearch/reference/current/search-fields.html#source-filtering
- 几个 Whosebug 答案
- 甚至尝试过命名查询
我在这里错过了什么?
从 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”参数作为 body
或 query
传递。
如果我的“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)
因此,可以理解 query
和 body
是在索引上请求数据的两种不同方式。
注意:Python elasticsearch 客户端可能很快就会弃用其请求中的 body
参数。在这种情况下,让我们看看如何对 filtered/queried 数据进行子集化。
希望对其他人有所帮助。
我可以在 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)
到目前为止,我很容易就能得到结果。但是,由于返回的字段太多,我只想在将其转换为数据框之前检索特定字段。我可以将它转换成数据帧然后进行过滤,但这不是最优的。
我尝试将 _source
和 field
方法添加为:
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]')
我关注了:
- https://www.elastic.co/guide/en/elasticsearch/reference/current/search-fields.html
- https://www.elastic.co/guide/en/elasticsearch/reference/current/search-fields.html#source-filtering
- 几个 Whosebug 答案
- 甚至尝试过命名查询
我在这里错过了什么?
从 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”参数作为 body
或 query
传递。
如果我的“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)
因此,可以理解 query
和 body
是在索引上请求数据的两种不同方式。
注意:Python elasticsearch 客户端可能很快就会弃用其请求中的 body
参数。在这种情况下,让我们看看如何对 filtered/queried 数据进行子集化。
希望对其他人有所帮助。