在 _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 中的最大字段数?的主要内容,如果未能解决你的问题,请参考以下文章

在弹性搜索中聚合值数组

有没有办法在 Google AppEngine Search API 中查询字段至少包含一个搜索项的文档?

从弹性搜索中的评分中删除提升项

弹性搜索5.x中地理距离查询中的返回距离

Elastic Search SQL Server同步

节点js中的REST api,用于使用弹性搜索进行全文搜索