我grails elasticsearch
在应用程序中使用了插件,但遇到了一个奇怪的异常。
我有一种方法可以使用geo_distance
过滤器建立请求:
def activityList = ElasticSearchService.search(
[types:[DomainA, DomainB],
sort: orderBy, order: orderAs, size: (int)maxRes],
{
// bla bla bla some working closure building a working query
}
if(centerLat != -1){
filter{
geo_distance(
'distance': searchRadius,
'activityLocation': [lat: (Double)centerLat, lon: (Double)centerLon]
)
}
}
}
)
每当我尝试使用带有过滤器的方法(也就是,当我例如设置searchRadius
到'5km'
和centerLat
/centerLon
到正确的坐标,我的ElasticSearch
节点就会发疯,并保持记录以下错误,直到我将它关闭:
| Error 2014-08-27 10:31:49,076 [elasticsearch[Agent Zero][bulk][T#2]] ERROR index.IndexRequestQueue - Failed bulk item: MapperParsingException[failed to parse]; nested: ElasticsearchParseException[field must be either 'lat', 'lon' or 'geohash'];
由于这种原因,我尝试在网上查看MappingParserException
,最终查看了该类的源代码org.elasticsearch.common.geo.GeoUtils
。显然,抛出异常是因为mylat
和lon
field不是数字(请参见372
和381
)。
为什么会这样呢?我是否声明过滤器错误?
已经有一段时间了,这个问题让我有些不安,但是我终于解决了。
我以这种方式映射了以下类:
class A{
static searchable={
activityLocation geoPoint:true, component:true
// some other mappings on some other fields
}
Location activityLocation
// some other fields
}
a
class Location{
static searchable = true
String locationName
Double lat
Double lon
}
有两个问题:
我不想root false
在映射activityLocation
对象时使用该选项,因为我希望能够直接搜索它们,这导致我的A
对象包含以下属性(请注意id
字段的存在):
'activityLocation' : { 'id':'1', 'locationName' : 'foo', 'lat': '42.5464', 'lon': '65.5647' }
这不是一个geoPoint
原因,因为它不仅具有lat
andlon
域。
locationName
属性映射为activityLocation
对象的一部分,这使它们不是 geoPoint
s。我最终通过将映射更改为以下值来解决了这个问题activityLocation
:
ActivityLocation{
static searchable = {
only = ['lat', 'lon']
root false
}
String locationName
Double lat
Double lon
}
这解决了我的问题,从那时起我的搜索进行得很顺利。
我还必须补充一点,我对此感到非常困惑,因为我无法为地图映射geoPoint
更多属性而感到失望。我希望可以在映射中包含其他字段。
此外,我希望插件能使我更好地访问ES日志,花了我一段时间才弄清楚在哪里查找错误代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句