我正在尝试从字段缺失或空的特定字段中获取值。
我是这样想的---
$query['body'] = '{
"aggs": {
"missing_field": {
"missing" : {
"field" : "category"
}
}
}
}';
$results = $client->search($query);
我得到像---
这样的输出{
took: 4,
timed_out: false,
_shards: {},
hits: {},
aggregations: {
missing_field: {
doc_count: 1001
}
}
}
但聚合返回所有文件,它只返回计数,但我需要所有缺少这些字段的文件而不仅仅是计数。
有人知道如何解决这个问题。
答案 0 :(得分:2)
如果你想在不使用php代码的情况下将结果聚合为missing / not_missing:
{
"query": {
"filtered": {
"filter": {
"missing": {
"field": "category"
}
}
}
},
"aggs": {
"miss": {
"missing": {
"field": "category"
}
},
"not_miss": {
"filter": {
"exists": {
"field": "category"
}
}
}
}
}
或者,如果您希望查询返回"缺少"类别,但计算丢失和不缺少类别的聚合,执行此操作(使用忽略初始查询结果的global
聚合):
{
"query": {
"filtered": {
"filter": {
"missing": {
"field": "category"
}
}
}
},
"aggs": {
"allDocs": {
"global": {},
"aggs": {
"miss": {
"missing": {
"field": "category"
}
},
"not_miss": {
"filter": {
"exists": {
"field": "category"
}
}
}
}
}
}
}
如果您只想要缺少的类别,则不需要聚合:
{
"query": {
"filtered": {
"filter": {
"missing": {
"field": "category"
}
}
}
}
}
您可以显示"某些"聚合本身内的文档,但不能全部显示。它对节点的压力非常大。
答案 1 :(得分:1)
根据$ results array / dataset中行的数据类型,您可以执行以下操作:
foreach ($results as $result) {
//In case if $result is an object
if (isset ($result->category) == FALSE || is_null($result->category)) {
//Do something here as category does not exist
}
//In case if $result is an associative array
if (isset ($result['category']) == FALSE || is_null($result['category'])) {
//Do something here as category does not exist
}
}