【问题标题】:"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.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} 
                                            }
                                        }

这是我得到的错误: ServerError:类型:search_phase_execution_exception 原因:“所有分片失败” CausedBy:“类型:script_exception 原因:“编译错误” CausedBy:“类型:非法参数异常原因:“['for'] 附近的令牌序列无效。” CausedBy: "类型:no_viable_alt_exception 原因:"no_viable_alt_exception: null""""

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

我尝试使用计数器 (i) 进行简单的 for 循环来检查语法但同样的错误。所以看起来我在循环中使用的任何东西都返回错误。

有人可以帮助找到正确的语法吗?提前致谢。

【问题讨论】:

    标签: elasticsearch elasticsearch-painless


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 2014-08-20
    • 2015-07-03
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2016-04-17
    相关资源
    最近更新 更多