我有一个“用户”弹性搜索索引,用户看起来像:
{
"id" : 1,
"name" : "Jeroen",
"hours": [8,9,10,11,12,19,20,21,22,23],
"country": "NL",
"utc_offset": 1.0
}
我想查找“小时”字段包含本地时间当前小时的所有用户。因此,例如,我只想在荷兰的 8.00-12.00 或 20.00-23.00 之间找到上述用户。
我的解决方案是使用脚本过滤器。我不知道如何用 MVEL 实现这个,所以我安装了javascript 插件。现在我的查询如下所示:
{
"query": {
"match_all": {}
},"filter": {
"script": {
"script": "var a = doc['hours'].values; var d = new Date(); d.setTime(d.getTime() + doc['utc_offset'].value * 3600 * 1000); a.indexOf('' + d.getHours()) != -1",
"params": {}
}
}
}
所以这行得通,但过了一段时间,elasticsearch 开始抛出异常,如下所示:
{
"error": "SearchPhaseExecutionException[Failed to execute phase [query], all shards failed; shardFailures {[x9FlNmmsT26hJbrfnyH2uA][users][2]: QueryPhaseExecutionException[[users][2]: query[ConstantScore(*:*)],from[0],size[10]: Query Failed [Failed to execute main query]]; nested: IllegalAccessError[org/elasticsearch/index/fielddata/ScriptDocValues$Strings$1]; }{[x9FlNmmsT26hJbrfnyH2uA][users][3]: QueryPhaseExecutionException[[users][3]: query[ConstantScore(*:*)],from[0],size[10]: Query Failed [Failed to execute main query]]; nested: IllegalAccessError[org/elasticsearch/index/fielddata/ScriptDocValues$Strings$1]; }{[x9FlNmmsT26hJbrfnyH2uA][users][0]: QueryPhaseExecutionException[[users][0]: query[ConstantScore(*:*)],from[0],size[10]: Query Failed [Failed to execute main query]]; nested: IllegalAccessError[org/elasticsearch/index/fielddata/ScriptDocValues$Strings$1]; }{[x9FlNmmsT26hJbrfnyH2uA][users][2]: QueryPhaseExecutionException[[users][3]: query[ConstantScore(*:*)],from[0],size[10]: Query Failed [Failed to execute main query]]; nested: IllegalAccessError[org/elasticsearch/index/fielddata/ScriptDocValues$Strings$1]; }{[x9FlNmmsT26hJbrfnyH2uA][users][4]: QueryPhaseExecutionException[[users][4]: query[ConstantScore(*:*)],from[0],size[10]: Query Failed [Failed to execute main query]]; nested: IllegalAccessError[org/elasticsearch/index/fielddata/ScriptDocValues$Strings$1]; }]",
"status": 500
}
发布了一个类似的问题,有人建议这是 JIT 编译器的问题。作为一种解决方法,建议使用“-Dmvel2.disable.jit=true”禁用它。我已经尝试过了,将它放在 /etc/default/elasticsearch 的 ES_JAVA_OPTS 中,但它似乎没有任何效果。
有没有人知道出了什么问题以及如何解决它,或者有另一种执行此查询的方法?