在 _search api 的弹性搜索中支持包含在 _source.includes 中的最大字段数?
Posted
技术标签:
【中文标题】在 _search api 的弹性搜索中支持包含在 _source.includes 中的最大字段数?【英文标题】:Maximum number of fields support to be included in _source.includes in Elastic search for _search api? 【发布时间】:2022-01-03 21:49:12 【问题描述】:在查询 _source.includes 中包含超过 1500 个字段的索引时,我收到来自 ES 的以下错误。
错误日志:
"took": 154,
"timed_out": false,
"_shards":
"total": 28,
"successful": 15,
"skipped": 0,
"failed": 13,
"failures": [
"shard": 0,
"index": "index123",
"node": "...",
"reason":
"type": "too_complex_to_determinize_exception",
"reason": "too_complex_to_determinize_exception: Determinizing automaton with 52903 states and 54499 transitions would result in more than 10000 states."
]
,....
这是我尝试执行的示例查询。
查询示例:
"explain": false,
"size": 20,
"query":
"bool":
"filter": [
"bool":
"adjust_pure_negative": true,
"must": [
"terms":
"boost": 1,
"type": [
"University"
]
],
"boost": 1
],
"adjust_pure_negative": true,
"boost": 1
,
"from": 0,
"_source":
"excludes": [
],
"includes": [
--1579 fields included --
]
注意:当尝试将 _source.includes 中的字段数降低到 1440 左右时,ES 能够无错误地给出响应。
我想知道是否对可以在 _source 中添加的数字字段或任何配置设置来增加该限制有任何硬性限制。
如果有任何替代方法可以将如此大量的字段包含在内并从 ES 中返回,这也会很有帮助。
提前致谢!
【问题讨论】:
您的索引映射中有多少个字段?如果您使用fields: [...]
而不是_source: [...]
,会发生什么?
如果你得到(几乎?)所有字段,实际上返回整个_source
(从查询中完全删除_source
)实际上可能更高效?
@Val,我有多种类型的 1600 多个字段。使用字段:[..] 而不是 _source 给出了结果,但你能解释一下为什么 ES 在字段之间表现不同:[] &n _source。谢谢你的建议!
@ilvar,Yaa 完全删除 _source 会给我结果,但我的用例不是提取所有字段。谢谢你的建议!
这就是fields
在_source
失败时起作用的原因:github.com/elastic/elasticsearch/issues/49028
【参考方案1】:
有这么多字段,您应该排除(使用_source.excludes
)不需要的字段,而不是包括您需要的字段,这样查询中的字段就会更少。
另一个解决方案,因为_source
has limitations with a high number of fields,您还可以利用通常比_source
执行更好的fields
option。
【讨论】:
这个运气好吗?以上是关于在 _search api 的弹性搜索中支持包含在 _source.includes 中的最大字段数?的主要内容,如果未能解决你的问题,请参考以下文章