2

我有一个“用户”弹性搜索索引,用户看起来像:

{
  "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 中,但它似乎没有任何效果。

有没有人知道出了什么问题以及如何解决它,或者有另一种执行此查询的方法?

4

0 回答 0