我有一些数据,我正在尝试获得具有特定月份且距离目标点不到1.6公里的所有结果。我正在使用PHP客户端,所以我的查询看起来像这样。
$crimeSearch = [
'size' => 0,
'query' => [
'filtered' => [
'filter' => [
'bool' => [
'must' => [
'term' => [
'month' => $date,
],
'geo_distance_range' => [
'location' => [
'lat' => $lat,
'lon' => $lng,
],
'lt' => '1.6km',
],
],
],
],
],
],
'aggs' => [
'group_by_category' => [
'terms' => [
'field' => 'category',
],
],
],
];
我目前看到以下错误:
query_parsing_exception: No query registered for [location]
我的映射如下所示:
"properties": {
"location": {
"type": "geo_point"
},
"category": {
"type": "string",
"index": "not_analyzed"
},
"month": {
"type": "string",
"index": "not_analyzed"
}
}
现在,如果我从must数组中注释掉术语值或geo_distance_range值,那么我会得到正确的结果。只有当它们都存在时才会发生此错误。
任何人都可以看到我的查询错误吗?
我已经尝试将geo_distance_range移动到它自己的必须块中,但这似乎会带回所有与必须过滤器匹配的结果,而不是它们两者。
如果您需要更多信息,请询问!
谢谢。
答案 0 :(得分:1)
我对PHP一无所知,但如果我尝试转换等效的ES json query
,那么这可能会有效。我想你需要将每个must clause
放在数组中,就像这样
[
'size' => 0,
'query' => [
'filtered' => [
'filter' => [
'bool' => [
'must' => [
[
'term' => [
'month' => $date,
]
],
[
'geo_distance_range' => [
'location' => [
'lat' => $lat,
'lon' => $lng,
],
'lt' => '1.6km',
],
],
],
],
],
],
],
'aggs' => [
'group_by_category' => [
'terms' => [
'field' => 'category',
],
],
],
];
这相当于
{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"term": {
"month": "June"
}
},
{
"geo_distance_range": {
"lt": "1.6km",
"location": {
"lat": 37.9174,
"lon": -122.305
}
}
}
]
}
}
}
}
}
这有用吗?