处理Null值

时间:2015-09-23 11:28:12

标签: php elasticsearch

弹性搜索中的

我正在尝试从字段缺失或空的特定字段中获取值。

我是这样想的---

                $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
}
}
}

但聚合返回所有文件,它只返回计数,但我需要所有缺少这些字段的文件而不仅仅是计数。

有人知道如何解决这个问题。

2 个答案:

答案 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
    }
}