无痛脚本查询中的“['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'] 附近的令牌序列无效”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何检查整数0是不是包含在数组中无痛,ElasticSearch

elasticsearch无痛组合聚合密钥及其嵌套聚合密钥

如何为用户创建无痛的安全春季社交注册/登录

安装新版本 R 的无痛方式?

无痛本地开发,同时还引用 NuGet 包

小程序无痛刷新token