包含特定字段是否可以更改elasticsearch结果集?

时间:2019-05-11 23:36:09

标签: elasticsearch

如果从结果中排除特定字段,我有一个ES查询返回414个文档。

如果我包含此字段,则文档数将降至328。

被删除的文档是一致的,无论我滚动结果还是直接查询,都会发生这种情况。

减少结果集的字段的字段映射如下:

"completion": {
     "type": "object",
     "enabled": false
}

没什么特别的,我还启用了其他功能:错误的对象类型字段在此查询中返回的效果很好。

我针对具有相同数据的多个索引进行了测试,以排除损坏(希望如此)。

此“完成”对象是一个嵌套且被忽略的对象,具有4或5个嵌套级别,但我又一次发现了其他类似的嵌套对象,它们对于此查询的返回结果都很好。

查询是414个词的简单词匹配(是的,这很糟糕,我们正在对此重新考虑策略):

  var { _scroll_id, hits } = await elastic.search({
    index: index,
    type: type,
    body: shaQuery,
    scroll: '10s',
    _source_exclude: 'account,layout,surveydata,verificationdata,accounts,scores'
  });
  while (hits && hits.hits.length) {
    // Append all new hits
    allRecords.push(...hits.hits)

    var { _scroll_id, hits } = await elastic.scroll({
      scrollId: _scroll_id,
      scroll: '10s'
    })
  }

查询为:

"query": {
        "terms": {
            "_id": [
                "....",
                "....",
                "...."
            }
        }
}

在这个例子中,我只会得到328个结果。如果我在_source_exclude上添加“ completion”,那么我将得到完整的设置。

因此,我的问题是:当该字段与搜索完全无关时,在结果中包含一个字段会限制搜索的情况是什么?

#特定于此示例,但在查询中保持一致。我只是将它们包括在内,以作为整个问题的背景信息。

同样重要的是,此完成字段在包含和排除的记录之间具有相同的数据和格式,我看不到会引起问题的任何内容。

1 个答案:

答案 0 :(得分:0)

发现了问题,它是晦涩的。我们看到的是它总是在同一时间失效,并且当对其进行更仔细的检查时,也会出现相同的错误:

{ took: 158,
 timed_out: false,
 _shards:
  { total: 5,
    successful: 4,
    skipped: 0,
    failed: 1,
    failures: [ [Object] ] },
[ { shard: 0,
   index: ‘theindexname’,
   node: ‘4X2vwouIRriYbQTQcHQ_sw’,
   reason:
    { type: ‘illegal_argument_exception’,
      reason:
       ‘cannot write xcontent for unknown value of type class java.math.BigInteger’ } } ]

好吧,这很奇怪,我们根本没有使用BigIntegers。但是,由于有了Google的强大功能,elasticsearch问题跟踪器中的该问题才得以发现:

https://github.com/elastic/elasticsearch/pull/32888

“用于处理BigInteger和BigDecimal的XContentBuilder”是6.3中的一个错误,其中使用BigInteger和BigDecimal的字段将无法序列化,因此在应用源过滤时会中断。我们正在运行6.3。

目前尚不清楚为什么我们的系统会触发此问题,但是升级到6.5可以完全解决问题。

晦涩晦涩,但由于Javier's的持久性而得以解决。