无痛脚本查询中的“['for'] 附近的令牌序列无效”错误
Posted
技术标签:
【中文标题】无痛脚本查询中的“[\'for\'] 附近的令牌序列无效”错误【英文标题】:"invalid sequence of tokens near ['for']" error in painless script query无痛脚本查询中的“['for'] 附近的令牌序列无效”错误 【发布时间】:2022-01-17 10:01:27 【问题描述】:在 .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.maxDistancereturn 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
这是我得到的错误: ServerError:类型:search_phase_execution_exception 原因:“所有分片失败” CausedBy:“类型:script_exception 原因:“编译错误” CausedBy:“类型:非法参数异常原因:“['for'] 附近的令牌序列无效。” CausedBy: "类型:no_viable_alt_exception 原因:"no_viable_alt_exception: null""""
我还在循环中尝试了布尔变量并尝试在最后返回它,但我得到了同样的错误。
我尝试使用计数器 (i) 进行简单的 for 循环来检查语法但同样的错误。所以看起来我在循环中使用的任何东西都返回错误。
有人可以帮助找到正确的语法吗?提前致谢。
【问题讨论】:
【参考方案1】:条件中不能有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;
【讨论】:
我试图运行这个脚本(第二部分),但我得到了这个一般错误,没有太多细节。第一部分运行没有错误。 :“错误”:“请求执行失败。调用:状态码 400 来自:POST /qa1-provider-search/doc/_search?typed_keys=true。服务器错误:类型:search_phase_execution_exception 原因:“所有分片失败”“ 我使用的是弹性版本 6.7。这有什么区别吗? 能否分享您在 ES 服务器日志中看到的完整错误? 我不确定如何获取 ES 服务器日志。我也没有完全访问它的权限。但是对您的脚本进行了微小的更改,这是我看到的错误:“错误”:“请求无法执行。调用:状态代码 400 来自:POST /qa1-provider-search/doc/_search?typed_keys=true。服务器错误:类型:search_phase_execution_exception 原因:\"所有分片失败\" CausedBy:\"类型:script_exception 原因:\"编译错误\" CausedBy:\"类型:非法参数_异常 原因:\"Extraneous for loop.\"\" 我们有 AWS 托管的弹性实例,以防万一,如果有什么不同的话。【参考方案2】:这对我有用。我必须检查办公室参数的密钥和大小。 :
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;
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。以上是关于无痛脚本查询中的“['for'] 附近的令牌序列无效”错误的主要内容,如果未能解决你的问题,请参考以下文章