无法使用术语和geo_distance_range必须同时过滤

时间:2015-12-26 22:50:13

标签: php elasticsearch

我有一些数据,我正在尝试获得具有特定月份且距离目标点不到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移动到它自己的必须块中,但这似乎会带回所有与必须过滤器匹配的结果,而不是它们两者。

如果您需要更多信息,请询问!

谢谢。

1 个答案:

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

这有用吗?