Elasticsearch 无法使用 lang groovy 运行内联脚本 [doc ....]

Posted

技术标签:

【中文标题】Elasticsearch 无法使用 lang groovy 运行内联脚本 [doc ....]【英文标题】:Elasticsearch failed to run inline script [doc....] using lang groovy 【发布时间】:2016-06-15 13:07:15 【问题描述】:

我在尝试匹配索引中的所有内容并显示给定 geo_point 和查询结果之间的距离时遇到此错误,我正在使用DrTech's 脚本的答案来显示距离:

这是我的 DSL 查询:


  "query": 
    "match_all": 
  ,
  "script_fields": 
    "distance": 
      "lang": "groovy",
      "params": 
        "lat": 2.27,
        "lon": 50.3
      ,
      "script": "doc['geo_coordinates'].distanceInKm(lat,lon)"
    
  

查询响应:


  "took": 50,
  "timed_out": false,
  "_shards": 
    "total": 5,
    "successful": 4,
    "failed": 1,
    "failures": [
      
        "shard": 0,
        "index": "users",
        "node": "pa76fjdWQl2YAHmgCT4oKw",
        "reason": 
          "type": "script_exception",
          "reason": "failed to run inline script [doc['geo_coordinates'].distanceInKm(lat,lon)] using lang [groovy]",
          "caused_by": 
            "type": "null_pointer_exception",
            "reason": null
          
        
      
    ]
  ,
  "hits": 
    "total": 184,
    "max_score": 1,
    "hits": []
  

我的映射中有这个:

  "geo_coordinates" : 
            "type" : "geo_point",
            "lat_lon" : true
          ,

所以我不明白为什么我得到一个空指针! .....

【问题讨论】:

您的一份文件是否可能没有geo_coordinates 字段? 不可能它确实存在于我的 Mongodb 和我的 Elasticsearch 映射中 我不是在谈论映射,但如果您只有一个文档实例,该字段没有任何值,那可能会解释 NPE。 是的,有些用户的这个字段没有任何值! 好了,你应该修改你的脚本,只在值存在时调用distanceInKm() 【参考方案1】:

这可能是因为其中一个文档在geo_coordinates 字段中没有任何值。因此,您需要在脚本中考虑这种情况。

试试这个:


  "query": 
    "match_all": 
  ,
  "script_fields": 
    "distance": 
      "lang": "groovy",
      "params": 
        "lat": 2.27,
        "lon": 50.3
      ,
      "script": "doc['geo_coordinates'] ? doc['geo_coordinates'].distanceInKm(lat,lon) : 0"
    
  

【讨论】:

"doc['geo_coordinates']?.distanceInKm(lat,lon) ?: 0" 应该也能正常工作 没错,这是实现相同目标的一种更简洁的常规方式。

以上是关于Elasticsearch 无法使用 lang groovy 运行内联脚本 [doc ....]的主要内容,如果未能解决你的问题,请参考以下文章

org.elasticsearch.bootstrap.StartupException:java.lang.IllegalArgumentException:

Google App Engine JSP 无法部署:java.lang.RuntimeException:无法获取系统 Java 编译器。请使用 JDK,而不是 JRE

无法锁定JVM内存:error = 12,reason =无法分配内存 - Elasticsearch 6.2.4

ElasticSearch出现java.lang.IllegalStateException: duplicate plugin: - Plugin information:

java.lang.NoClassDefFoundError: org/elasticsearch/common/xcontent/ToXContentObject

Elasticsearch和Java Spring Boot:java.lang.NoSuchMethodError: