为什么我的Elasticsearch分片在针对我的别名过滤器运行查询时偶尔会失败?

时间:2015-07-23 12:59:10

标签: groovy elasticsearch

我目前正在运行带有两个节点的Elasticsearch v.1.6设置,以及一个包含5个分片的索引。对于这个索引,我添加了一个包含对我的索引的引用的别名,以及一个Groovy脚本过滤器,它有助于避免使用无效的开始和结束日期的文档。别名如下:

"MyIndex" : {
   "aliases": { 
       "MyIndex_alias": { 
            "filter" : {
                "script":{ 
                    "script":
                        "\r\n entryDate = doc['availability.start'].date.getMillis();
                         \r\n exitDate =  doc['availability.end'].date.getMillis();
                         \r\n rightNow = DateMidnight.now().getMillis();
                         \r\n\r\n if (entryDate < rightNow && exitDate > rightNow)\r\n {
                                       \r\n return true;
                             \r\n }
                             \r\n return false;",
                        "lang":"groovy"}}}}}

执行简单查询(例如term *(/ MyIndex_alias / my_type / _search?request.q = *))时,许多分片将无法使查询返回以下消息:

"failed": 1,
"failures": [
    {
        "index": "MyIndex",
        "shard": 2,
        "status": 500,
        "reason": "RemoteTransportException[[MyESCluster][inet[/10.131.43.61:9301]][indices:data/read/search[phase/query]]]; nested: QueryPhaseExecutionException[[MyIndex][2]: query[ConstantScore(ScriptFilter(
        entryDate = doc['availability.start'].date.getMillis();
        exitDate = doc['availability.end'].date.getMillis();
        rightNow = DateMidnight.now().getMillis();

        if (entryDate < rightNow && exitDate > rightNow)
        {
             return true;
        }
        return false;))],from[0],size[10]: Query Failed [Failed to execute main query]]; nested: GroovyScriptExecutionException[ArrayIndexOutOfBoundsException[null]]; "
    }
]

我已经验证了以下内容:

  1. 我索引中的所有文档都有有效的开始值和结束值,并且没有一个文件具有空值。
  2. 过滤器 对成功执行查询的分片起作用
  3. 群集具有绿色健康状态
  4. 错误在主节点和工作节点中的分片上随机发生
  5. 如果将查询定向到索引而不是别名
  6. ,则不会发生错误
  7. 向群集添加更多节点似乎可以缓解此问题。使用2个节点运行通常会导致2-3个分片失败,而3个节点将故障限制为1-2个分片。添加最后的第4个节点会使查询在单个分片上很少失败
  8. 即使查询成功,我有时也会得到比预期更少的结果,而且偶尔也是如此。
  9. 对此事的任何帮助将不胜感激!

0 个答案:

没有答案