在elasticsearch(版本1.4.3)中,当通过lucene expression lang使用script_score时,在尝试任何表达式字段函数时总是得到QueryParsingException
,例如:
doc['field_name'].distance(lat, lon),
doc['field_name'].distanceWithDefault(lat, lon, default)
和doc['field_name'].geohashDistanceInKm(geohash)
。请参阅文档所说的list of Expressions。
值得注意的是,值表达式被接受(尽管我没有测试它们的值是否正确)。因此,接受提及doc['field_name'].value
的脚本 - 至少是解析器。
鉴于Groovy的安全漏洞,许多托管的弹性搜索提供程序(如盆景)已经关闭了对Groovy语言功能的支持。我的想法是没有任何函数绑定到表达式lang。
示例:
"script_score" : {
"lang" : "expression",
"script": "exp(pow(doc['location'].geohashDistanceInKm(geohash), 2) / (pow(scale, 2) / ln(decay)))",
"params": {
"geohash" : "9q8yy",
"scale" : "0.3",
"decay" : "0.1"
}
}
让我不高兴:
IllegalArgumentException[Unrecognized method call (doc['location'].geohashDistanceInKm).]
是的,location
是geo_point类型:
"location": {
"type": "geo_point"
},
希望确认这一点。现在我将编写客户端解决方法的代码。