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