一个可能不完整但有很大帮助的解决方案是使用filter_path https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#common-options-response-filtering。例如,假设我们的索引中有以下内容:
PUT foods/_doc/_bulk
{ "index" : { "_id" : "1" } }
{ "name" : "chocolate cake", "calories": "too much" }
{ "index" : { "_id" : "2" } }
{ "name" : "lemon pie", "calories": "a lot!" }
{ "index" : { "_id" : "3" } }
{ "name" : "pizza", "calories": "oh boy..." }
像这样的搜索...
GET foods/_search
{
"query": {
"match_all": {}
}
}
...将产生大量元数据:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 3,
"max_score" : 1.0,
"hits" : [
{
"_index" : "foods",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"name" : "lemon pie",
"calories" : "a lot!"
}
},
{
"_index" : "foods",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "chocolate cake",
"calories" : "too much"
}
},
{
"_index" : "foods",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"name" : "pizza",
"calories" : "oh boy..."
}
}
]
}
}
但是如果我们给搜索 URL 参数filter_path=hits.hits._source
...
GET foods/_search?filter_path=hits.hits._source
{
"query": {
"match_all": {}
}
}
...它只会返回源(尽管仍然嵌套得很深):
{
"hits" : {
"hits" : [
{
"_source" : {
"name" : "lemon pie",
"calories" : "a lot!"
}
},
{
"_source" : {
"name" : "chocolate cake",
"calories" : "too much"
}
},
{
"_source" : {
"name" : "pizza",
"calories" : "oh boy..."
}
}
]
}
}
您甚至可以过滤字段:
GET foods/_search?filter_path=hits.hits._source.name
{
"query": {
"match_all": {}
}
}
...你会得到这个:
{
"hits" : {
"hits" : [
{
"_source" : {
"name" : "lemon pie"
}
},
{
"_source" : {
"name" : "chocolate cake"
}
},
{
"_source" : {
"name" : "pizza"
}
}
]
}
}
如果您愿意,您还可以做更多事情:只需检查文档 https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#common-options-response-filtering.