如果从结果中排除特定字段,我有一个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”,那么我将得到完整的设置。
因此,我的问题是:当该字段与搜索完全无关时,在结果中包含一个字段会限制搜索的情况是什么?
#特定于此示例,但在查询中保持一致。我只是将它们包括在内,以作为整个问题的背景信息。
同样重要的是,此完成字段在包含和排除的记录之间具有相同的数据和格式,我看不到会引起问题的任何内容。
答案 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的持久性而得以解决。