";在['for']"附近的无效令牌序列;无痛脚本查询中出错



使用.net:中的Nest库执行此脚本查询时出错

new ScriptQuery
{
Lang = "painless",
Source = "(!doc[params.headquartersCoordinatesField].empty && doc[params.headquartersCoordinatesField].arcDistance(params.latitude, params.longitude) * 0.000621371 <= params.maxDistance) || (!doc[params.offices].empty && (for (def office : doc[params.offices].values){if(office.coordinates).arcDistance(params.latitude, params.longitude) * 0.000621371 < =params.maxDistance{return true;}}))",
Params = new Dictionary<string, object>
{
{"headquartersCoordinatesField", Field<Provider>(f => f.Headquarters.Coordinates)},
{"offices", Field<Provider>(f => f.Offices)},
{"latitude", _latitude},
{"longitude", _longitude},
{"maxDistance", 50} 
}
}

这是我得到的错误:服务器错误:类型:search_phase_execution_exception原因:"所有碎片都失败了";原因:;类型:script_exception原因:"编译错误";原因:;类型:非法_参数_异常原因:"['f']附近的标记序列无效"原因:;类型:no_viable_alt_exception原因:"no_viable_alt_exception:空"quot"quot;

我还在循环中尝试了布尔变量,并试图在最后返回,但我得到了同样的错误。

我尝试了使用计数器(I(的简单for循环来检查语法,但出现了相同的错误。所以看起来我在循环中使用的任何东西都会返回错误。

有人能帮忙找到正确的语法吗?提前谢谢。

条件中不能有for循环,这没有意义。

以下是您的脚本应该是什么样子:

def hqCoordExist = !doc[params.headquartersCoordinatesField].empty;
def distToHq = doc[params.headquartersCoordinatesField].arcDistance(params.latitude, params.longitude);
if (hqCoordExist && distToHq * 0.000621371 <= params.maxDistance) {
return true;
}

def officesExist = !doc[params.offices].empty;
if (officesExist) {
for (def office : doc[params.offices].values) {
def distToOffice = office.coordinates.arcDistance(params.latitude, params.longitude);
if (distToOffice * 0.000621371 <= params.maxDistance) {
return true;
}
}
}
return false;

这对我很有效。我必须检查密钥和办公室大小参数:

if(!doc[params.headquartersCoordinatesField].empty && doc[params.headquartersCoordinatesField].arcDistance(params.latitude, params.longitude) * 0.000621371 <= params.maxDistance) 
{ 
return true; 
} 
def officesCollection = new ArrayList();
if(doc.containsKey(params.offices) && doc[params.offices].size() > 0) 
{ 
officesCollection = doc[params.offices].value; 
for (def office : officesCollection)
{
def distToOffice = 
office.coordinates.arcDistance(params.latitude, params.longitude);
if (distToOffice * 0.000621371 <= params.maxDistance)
{
return true;
}
}
}
return false;

最新更新