Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ML] categorize_text aggregation can suffer array index out of bounds exception #105836

Closed
droberts195 opened this issue Feb 28, 2024 · 1 comment · Fixed by #105987
Closed

[ML] categorize_text aggregation can suffer array index out of bounds exception #105836

droberts195 opened this issue Feb 28, 2024 · 1 comment · Fixed by #105987
Labels
>bug :ml Machine learning Team:ML Meta label for the ML team

Comments

@droberts195
Copy link
Contributor

The categorize_text aggregation can suffer from an array index out of bounds exception if it is nested beneath another aggregation and that other aggregation generates a large number of empty buckets at the end of its output range.

A concrete example is categorize_text nested under date_histogram over a time range that causes the date_histogram to have many buckets with doc_count zero at the end of the time range, for example when the time range of the search extends beyond the end of the data.

One way to reproduce the problem is as follows:

  1. Use Kibana's file upload functionality to import data.csv into an index called data.
  2. Run the following search in Dev Tools:
GET data/_search?error_trace=true
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "@timestamp": {
              "gte": "2024-02-25T22:45:31.453Z",
              "lte": "2024-02-26T23:00:31.453Z"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "quarter_hour": {
      "date_histogram": {
        "field": "@timestamp",
        "fixed_interval": "15m"
      },
      "aggs": {
        "categories": {
          "categorize_text": {
            "field": "message"
          }
        }
      }
    }
  },
  "size": 0
}

The output is as follows:

{
  "error": {
    "root_cause": [
      {
        "type": "array_index_out_of_bounds_exception",
        "reason": "Index 1 out of bounds for length 1",
        "stack_trace": """org.elasticsearch.ElasticsearchException$1: Index 1 out of bounds for length 1
	at org.elasticsearch.server@8.12.2/org.elasticsearch.ElasticsearchException.guessRootCauses(ElasticsearchException.java:699)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.SearchPhaseExecutionException.guessRootCauses(SearchPhaseExecutionException.java:160)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.ElasticsearchException.guessRootCauses(ElasticsearchException.java:681)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.ElasticsearchException.generateFailureXContent(ElasticsearchException.java:627)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.rest.RestResponse.build(RestResponse.java:180)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.rest.RestResponse.<init>(RestResponse.java:140)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.rest.RestResponse.<init>(RestResponse.java:111)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.rest.action.RestActionListener.onFailure(RestActionListener.java:55)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.rest.action.RestCancellableNodeClient$1.onFailure(RestCancellableNodeClient.java:96)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.tasks.TaskManager$1.onFailure(TaskManager.java:214)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerImplementations.safeAcceptException(ActionListenerImplementations.java:62)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerImplementations.safeOnFailure(ActionListenerImplementations.java:73)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.DelegatingActionListener.onFailure(DelegatingActionListener.java:27)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.support.ContextPreservingActionListener.onFailure(ContextPreservingActionListener.java:39)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerImplementations.safeAcceptException(ActionListenerImplementations.java:62)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerImplementations.safeOnFailure(ActionListenerImplementations.java:73)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.DelegatingActionListener.onFailure(DelegatingActionListener.java:27)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerImplementations.safeAcceptException(ActionListenerImplementations.java:62)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerImplementations.safeOnFailure(ActionListenerImplementations.java:73)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.DelegatingActionListener.onFailure(DelegatingActionListener.java:27)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerImplementations.safeAcceptException(ActionListenerImplementations.java:62)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerImplementations.safeOnFailure(ActionListenerImplementations.java:73)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.DelegatingActionListener.onFailure(DelegatingActionListener.java:27)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerImplementations$RunAfterActionListener.onFailure(ActionListenerImplementations.java:269)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.AbstractSearchAsyncAction.raisePhaseFailure(AbstractSearchAsyncAction.java:732)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.AbstractSearchAsyncAction.onPhaseFailure(AbstractSearchAsyncAction.java:709)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.AbstractSearchAsyncAction.executeNextPhase(AbstractSearchAsyncAction.java:401)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.AbstractSearchAsyncAction.onPhaseDone(AbstractSearchAsyncAction.java:741)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.AbstractSearchAsyncAction.onShardFailure(AbstractSearchAsyncAction.java:494)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.AbstractSearchAsyncAction$1.onFailure(AbstractSearchAsyncAction.java:332)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerImplementations.safeAcceptException(ActionListenerImplementations.java:62)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerImplementations.safeOnFailure(ActionListenerImplementations.java:73)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.DelegatingActionListener.onFailure(DelegatingActionListener.java:27)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerResponseHandler.handleException(ActionListenerResponseHandler.java:54)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.SearchTransportService$ConnectionCountingHandler.handleException(SearchTransportService.java:553)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.TransportService$UnregisterChildTransportResponseHandler.handleException(TransportService.java:1718)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.TransportService$ContextRestoreResponseHandler.handleException(TransportService.java:1435)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.doHandleException(InboundHandler.java:475)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.handleException(InboundHandler.java:462)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.handlerResponseError(InboundHandler.java:453)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.executeResponseHandler(InboundHandler.java:145)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.messageReceived(InboundHandler.java:122)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.inboundMessage(InboundHandler.java:96)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.TcpTransport.inboundMessage(TcpTransport.java:825)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundPipeline.forwardFragments(InboundPipeline.java:124)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundPipeline.doHandleBytes(InboundPipeline.java:96)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundPipeline.handleBytes(InboundPipeline.java:61)
	at org.elasticsearch.transport.netty4@8.12.2/org.elasticsearch.transport.netty4.Netty4MessageInboundHandler.channelRead(Netty4MessageInboundHandler.java:48)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.codec@4.1.94.Final/io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.handler@4.1.94.Final/io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1383)
	at io.netty.handler@4.1.94.Final/io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1246)
	at io.netty.handler@4.1.94.Final/io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1295)
	at io.netty.codec@4.1.94.Final/io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:529)
	at io.netty.codec@4.1.94.Final/io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:468)
	at io.netty.codec@4.1.94.Final/io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.transport@4.1.94.Final/io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.transport@4.1.94.Final/io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
	at io.netty.transport@4.1.94.Final/io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
	at io.netty.transport@4.1.94.Final/io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
	at io.netty.transport@4.1.94.Final/io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:689)
	at io.netty.transport@4.1.94.Final/io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:652)
	at io.netty.transport@4.1.94.Final/io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
	at io.netty.common@4.1.94.Final/io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
	at io.netty.common@4.1.94.Final/io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
	at org.elasticsearch.common.util.BigArrays$ObjectArrayWrapper.get(BigArrays.java:401)
	at org.elasticsearch.xpack.ml.aggs.categorization.CategorizeTextAggregator.buildAggregations(CategorizeTextAggregator.java:116)
	at org.elasticsearch.search.aggregations.bucket.BucketsAggregator.buildSubAggsForBuckets(BucketsAggregator.java:179)
	at org.elasticsearch.search.aggregations.bucket.BucketsAggregator.buildAggregationsForFixedBucketCount(BucketsAggregator.java:257)
	at org.elasticsearch.search.aggregations.bucket.range.RangeAggregator.buildAggregations(RangeAggregator.java:534)
	at org.elasticsearch.search.aggregations.AdaptingAggregator.buildAggregations(AdaptingAggregator.java:101)
	at org.elasticsearch.search.aggregations.Aggregator.buildTopLevel(Aggregator.java:159)
	at org.elasticsearch.search.aggregations.AggregatorCollector.doPostCollection(AggregatorCollector.java:47)
	at org.elasticsearch.search.query.QueryPhaseCollector.doPostCollection(QueryPhaseCollector.java:379)
	at org.elasticsearch.search.internal.ContextIndexSearcher.doAggregationPostCollection(ContextIndexSearcher.java:386)
	at org.elasticsearch.search.internal.ContextIndexSearcher.search(ContextIndexSearcher.java:375)
	at org.elasticsearch.search.internal.ContextIndexSearcher.lambda$search$4(ContextIndexSearcher.java:345)
	at org.apache.lucene.search.TaskExecutor$TaskGroup.lambda$createTask$0(TaskExecutor.java:118)
	at java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at org.elasticsearch.common.util.concurrent.TimedRunnable.doRun(TimedRunnable.java:33)
	at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:983)
	at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:26)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.lang.Thread.run(Thread.java:1583)
"""
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
    "grouped": true,
    "failed_shards": [
      {
        "shard": 0,
        "index": "data",
        "node": "hHGQzTWoQG-t7bNhQm40JQ",
        "reason": {
          "type": "array_index_out_of_bounds_exception",
          "reason": "Index 1 out of bounds for length 1",
          "stack_trace": """java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
	at org.elasticsearch.common.util.BigArrays$ObjectArrayWrapper.get(BigArrays.java:401)
	at org.elasticsearch.xpack.ml.aggs.categorization.CategorizeTextAggregator.buildAggregations(CategorizeTextAggregator.java:116)
	at org.elasticsearch.search.aggregations.bucket.BucketsAggregator.buildSubAggsForBuckets(BucketsAggregator.java:179)
	at org.elasticsearch.search.aggregations.bucket.BucketsAggregator.buildAggregationsForFixedBucketCount(BucketsAggregator.java:257)
	at org.elasticsearch.search.aggregations.bucket.range.RangeAggregator.buildAggregations(RangeAggregator.java:534)
	at org.elasticsearch.search.aggregations.AdaptingAggregator.buildAggregations(AdaptingAggregator.java:101)
	at org.elasticsearch.search.aggregations.Aggregator.buildTopLevel(Aggregator.java:159)
	at org.elasticsearch.search.aggregations.AggregatorCollector.doPostCollection(AggregatorCollector.java:47)
	at org.elasticsearch.search.query.QueryPhaseCollector.doPostCollection(QueryPhaseCollector.java:379)
	at org.elasticsearch.search.internal.ContextIndexSearcher.doAggregationPostCollection(ContextIndexSearcher.java:386)
	at org.elasticsearch.search.internal.ContextIndexSearcher.search(ContextIndexSearcher.java:375)
	at org.elasticsearch.search.internal.ContextIndexSearcher.lambda$search$4(ContextIndexSearcher.java:345)
	at org.apache.lucene.search.TaskExecutor$TaskGroup.lambda$createTask$0(TaskExecutor.java:118)
	at java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at org.elasticsearch.common.util.concurrent.TimedRunnable.doRun(TimedRunnable.java:33)
	at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:983)
	at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:26)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.lang.Thread.run(Thread.java:1583)
"""
        }
      }
    ],
    "caused_by": {
      "type": "array_index_out_of_bounds_exception",
      "reason": "Index 1 out of bounds for length 1",
      "caused_by": {
        "type": "array_index_out_of_bounds_exception",
        "reason": "Index 1 out of bounds for length 1",
        "stack_trace": """java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
	at org.elasticsearch.common.util.BigArrays$ObjectArrayWrapper.get(BigArrays.java:401)
	at org.elasticsearch.xpack.ml.aggs.categorization.CategorizeTextAggregator.buildAggregations(CategorizeTextAggregator.java:116)
	at org.elasticsearch.search.aggregations.bucket.BucketsAggregator.buildSubAggsForBuckets(BucketsAggregator.java:179)
	at org.elasticsearch.search.aggregations.bucket.BucketsAggregator.buildAggregationsForFixedBucketCount(BucketsAggregator.java:257)
	at org.elasticsearch.search.aggregations.bucket.range.RangeAggregator.buildAggregations(RangeAggregator.java:534)
	at org.elasticsearch.search.aggregations.AdaptingAggregator.buildAggregations(AdaptingAggregator.java:101)
	at org.elasticsearch.search.aggregations.Aggregator.buildTopLevel(Aggregator.java:159)
	at org.elasticsearch.search.aggregations.AggregatorCollector.doPostCollection(AggregatorCollector.java:47)
	at org.elasticsearch.search.query.QueryPhaseCollector.doPostCollection(QueryPhaseCollector.java:379)
	at org.elasticsearch.search.internal.ContextIndexSearcher.doAggregationPostCollection(ContextIndexSearcher.java:386)
	at org.elasticsearch.search.internal.ContextIndexSearcher.search(ContextIndexSearcher.java:375)
	at org.elasticsearch.search.internal.ContextIndexSearcher.lambda$search$4(ContextIndexSearcher.java:345)
	at org.apache.lucene.search.TaskExecutor$TaskGroup.lambda$createTask$0(TaskExecutor.java:118)
	at java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at org.elasticsearch.common.util.concurrent.TimedRunnable.doRun(TimedRunnable.java:33)
	at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:983)
	at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:26)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.lang.Thread.run(Thread.java:1583)
"""
      },
      "stack_trace": """org.elasticsearch.ElasticsearchException$1: Index 1 out of bounds for length 1
	at org.elasticsearch.server@8.12.2/org.elasticsearch.ElasticsearchException.guessRootCauses(ElasticsearchException.java:699)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.AbstractSearchAsyncAction.executeNextPhase(AbstractSearchAsyncAction.java:399)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.AbstractSearchAsyncAction.onPhaseDone(AbstractSearchAsyncAction.java:741)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.AbstractSearchAsyncAction.onShardFailure(AbstractSearchAsyncAction.java:494)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.AbstractSearchAsyncAction$1.onFailure(AbstractSearchAsyncAction.java:332)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerImplementations.safeAcceptException(ActionListenerImplementations.java:62)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerImplementations.safeOnFailure(ActionListenerImplementations.java:73)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.DelegatingActionListener.onFailure(DelegatingActionListener.java:27)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerResponseHandler.handleException(ActionListenerResponseHandler.java:54)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.SearchTransportService$ConnectionCountingHandler.handleException(SearchTransportService.java:553)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.TransportService$UnregisterChildTransportResponseHandler.handleException(TransportService.java:1718)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.TransportService$ContextRestoreResponseHandler.handleException(TransportService.java:1435)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.doHandleException(InboundHandler.java:475)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.handleException(InboundHandler.java:462)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.handlerResponseError(InboundHandler.java:453)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.executeResponseHandler(InboundHandler.java:145)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.messageReceived(InboundHandler.java:122)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.inboundMessage(InboundHandler.java:96)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.TcpTransport.inboundMessage(TcpTransport.java:825)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundPipeline.forwardFragments(InboundPipeline.java:124)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundPipeline.doHandleBytes(InboundPipeline.java:96)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundPipeline.handleBytes(InboundPipeline.java:61)
	at org.elasticsearch.transport.netty4@8.12.2/org.elasticsearch.transport.netty4.Netty4MessageInboundHandler.channelRead(Netty4MessageInboundHandler.java:48)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.codec@4.1.94.Final/io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.handler@4.1.94.Final/io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1383)
	at io.netty.handler@4.1.94.Final/io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1246)
	at io.netty.handler@4.1.94.Final/io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1295)
	at io.netty.codec@4.1.94.Final/io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:529)
	at io.netty.codec@4.1.94.Final/io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:468)
	at io.netty.codec@4.1.94.Final/io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.transport@4.1.94.Final/io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.transport@4.1.94.Final/io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
	at io.netty.transport@4.1.94.Final/io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
	at io.netty.transport@4.1.94.Final/io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
	at io.netty.transport@4.1.94.Final/io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:689)
	at io.netty.transport@4.1.94.Final/io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:652)
	at io.netty.transport@4.1.94.Final/io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
	at io.netty.common@4.1.94.Final/io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
	at io.netty.common@4.1.94.Final/io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
	at org.elasticsearch.common.util.BigArrays$ObjectArrayWrapper.get(BigArrays.java:401)
	at org.elasticsearch.xpack.ml.aggs.categorization.CategorizeTextAggregator.buildAggregations(CategorizeTextAggregator.java:116)
	at org.elasticsearch.search.aggregations.bucket.BucketsAggregator.buildSubAggsForBuckets(BucketsAggregator.java:179)
	at org.elasticsearch.search.aggregations.bucket.BucketsAggregator.buildAggregationsForFixedBucketCount(BucketsAggregator.java:257)
	at org.elasticsearch.search.aggregations.bucket.range.RangeAggregator.buildAggregations(RangeAggregator.java:534)
	at org.elasticsearch.search.aggregations.AdaptingAggregator.buildAggregations(AdaptingAggregator.java:101)
	at org.elasticsearch.search.aggregations.Aggregator.buildTopLevel(Aggregator.java:159)
	at org.elasticsearch.search.aggregations.AggregatorCollector.doPostCollection(AggregatorCollector.java:47)
	at org.elasticsearch.search.query.QueryPhaseCollector.doPostCollection(QueryPhaseCollector.java:379)
	at org.elasticsearch.search.internal.ContextIndexSearcher.doAggregationPostCollection(ContextIndexSearcher.java:386)
	at org.elasticsearch.search.internal.ContextIndexSearcher.search(ContextIndexSearcher.java:375)
	at org.elasticsearch.search.internal.ContextIndexSearcher.lambda$search$4(ContextIndexSearcher.java:345)
	at org.apache.lucene.search.TaskExecutor$TaskGroup.lambda$createTask$0(TaskExecutor.java:118)
	at java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at org.elasticsearch.common.util.concurrent.TimedRunnable.doRun(TimedRunnable.java:33)
	at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:983)
	at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:26)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.lang.Thread.run(Thread.java:1583)
"""
    },
    "stack_trace": """Failed to execute phase [query], all shards failed; shardFailures {[hHGQzTWoQG-t7bNhQm40JQ][data][0]: org.elasticsearch.transport.RemoteTransportException: [instance-0000000001][172.17.0.18:19563][indices:data/read/search[phase/query]]
Caused by: org.elasticsearch.search.query.QueryPhaseExecutionException: Query Failed [Failed to execute main query]
	at org.elasticsearch.search.query.QueryPhase.addCollectorsAndSearch(QueryPhase.java:229)
	at org.elasticsearch.search.query.QueryPhase.executeQuery(QueryPhase.java:135)
	at org.elasticsearch.search.query.QueryPhase.execute(QueryPhase.java:63)
	at org.elasticsearch.indices.IndicesService.lambda$loadIntoContext$31(IndicesService.java:1536)
	at org.elasticsearch.indices.IndicesService.lambda$cacheShardLevelResult$32(IndicesService.java:1602)
	at org.elasticsearch.indices.IndicesRequestCache$Loader.load(IndicesRequestCache.java:174)
	at org.elasticsearch.indices.IndicesRequestCache$Loader.load(IndicesRequestCache.java:157)
	at org.elasticsearch.common.cache.Cache.computeIfAbsent(Cache.java:418)
	at org.elasticsearch.indices.IndicesRequestCache.getOrCompute(IndicesRequestCache.java:120)
	at org.elasticsearch.indices.IndicesService.cacheShardLevelResult(IndicesService.java:1608)
	at org.elasticsearch.indices.IndicesService.loadIntoContext(IndicesService.java:1530)
	at org.elasticsearch.search.SearchService.loadOrExecuteQueryPhase(SearchService.java:516)
	at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:677)
	at org.elasticsearch.search.SearchService.lambda$executeQueryPhase$2(SearchService.java:545)
	at org.elasticsearch.action.ActionRunnable$3.accept(ActionRunnable.java:73)
	at org.elasticsearch.action.ActionRunnable$3.accept(ActionRunnable.java:70)
	at org.elasticsearch.action.ActionRunnable$4.doRun(ActionRunnable.java:95)
	at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:26)
	at org.elasticsearch.common.util.concurrent.TimedRunnable.doRun(TimedRunnable.java:33)
	at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:983)
	at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:26)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
	at org.elasticsearch.common.util.BigArrays$ObjectArrayWrapper.get(BigArrays.java:401)
	at org.elasticsearch.xpack.ml.aggs.categorization.CategorizeTextAggregator.buildAggregations(CategorizeTextAggregator.java:116)
	at org.elasticsearch.search.aggregations.bucket.BucketsAggregator.buildSubAggsForBuckets(BucketsAggregator.java:179)
	at org.elasticsearch.search.aggregations.bucket.BucketsAggregator.buildAggregationsForFixedBucketCount(BucketsAggregator.java:257)
	at org.elasticsearch.search.aggregations.bucket.range.RangeAggregator.buildAggregations(RangeAggregator.java:534)
	at org.elasticsearch.search.aggregations.AdaptingAggregator.buildAggregations(AdaptingAggregator.java:101)
	at org.elasticsearch.search.aggregations.Aggregator.buildTopLevel(Aggregator.java:159)
	at org.elasticsearch.search.aggregations.AggregatorCollector.doPostCollection(AggregatorCollector.java:47)
	at org.elasticsearch.search.query.QueryPhaseCollector.doPostCollection(QueryPhaseCollector.java:379)
	at org.elasticsearch.search.internal.ContextIndexSearcher.doAggregationPostCollection(ContextIndexSearcher.java:386)
	at org.elasticsearch.search.internal.ContextIndexSearcher.search(ContextIndexSearcher.java:375)
	at org.elasticsearch.search.internal.ContextIndexSearcher.lambda$search$4(ContextIndexSearcher.java:345)
	at org.apache.lucene.search.TaskExecutor$TaskGroup.lambda$createTask$0(TaskExecutor.java:118)
	at java.util.concurrent.FutureTask.run(FutureTask.java:317)
	... 6 more
}
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.AbstractSearchAsyncAction.onPhaseFailure(AbstractSearchAsyncAction.java:709)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.AbstractSearchAsyncAction.executeNextPhase(AbstractSearchAsyncAction.java:401)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.AbstractSearchAsyncAction.onPhaseDone(AbstractSearchAsyncAction.java:741)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.AbstractSearchAsyncAction.onShardFailure(AbstractSearchAsyncAction.java:494)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.AbstractSearchAsyncAction$1.onFailure(AbstractSearchAsyncAction.java:332)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerImplementations.safeAcceptException(ActionListenerImplementations.java:62)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerImplementations.safeOnFailure(ActionListenerImplementations.java:73)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.DelegatingActionListener.onFailure(DelegatingActionListener.java:27)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.ActionListenerResponseHandler.handleException(ActionListenerResponseHandler.java:54)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.SearchTransportService$ConnectionCountingHandler.handleException(SearchTransportService.java:553)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.TransportService$UnregisterChildTransportResponseHandler.handleException(TransportService.java:1718)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.TransportService$ContextRestoreResponseHandler.handleException(TransportService.java:1435)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.doHandleException(InboundHandler.java:475)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.handleException(InboundHandler.java:462)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.handlerResponseError(InboundHandler.java:453)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.executeResponseHandler(InboundHandler.java:145)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.messageReceived(InboundHandler.java:122)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundHandler.inboundMessage(InboundHandler.java:96)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.TcpTransport.inboundMessage(TcpTransport.java:825)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundPipeline.forwardFragments(InboundPipeline.java:124)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundPipeline.doHandleBytes(InboundPipeline.java:96)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.transport.InboundPipeline.handleBytes(InboundPipeline.java:61)
	at org.elasticsearch.transport.netty4@8.12.2/org.elasticsearch.transport.netty4.Netty4MessageInboundHandler.channelRead(Netty4MessageInboundHandler.java:48)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.codec@4.1.94.Final/io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.handler@4.1.94.Final/io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1383)
	at io.netty.handler@4.1.94.Final/io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1246)
	at io.netty.handler@4.1.94.Final/io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1295)
	at io.netty.codec@4.1.94.Final/io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:529)
	at io.netty.codec@4.1.94.Final/io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:468)
	at io.netty.codec@4.1.94.Final/io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.transport@4.1.94.Final/io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
	at io.netty.transport@4.1.94.Final/io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.transport@4.1.94.Final/io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
	at io.netty.transport@4.1.94.Final/io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
	at io.netty.transport@4.1.94.Final/io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
	at io.netty.transport@4.1.94.Final/io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:689)
	at io.netty.transport@4.1.94.Final/io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:652)
	at io.netty.transport@4.1.94.Final/io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
	at io.netty.common@4.1.94.Final/io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
	at io.netty.common@4.1.94.Final/io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: org.elasticsearch.ElasticsearchException$1: Index 1 out of bounds for length 1
	at org.elasticsearch.server@8.12.2/org.elasticsearch.ElasticsearchException.guessRootCauses(ElasticsearchException.java:699)
	at org.elasticsearch.server@8.12.2/org.elasticsearch.action.search.AbstractSearchAsyncAction.executeNextPhase(AbstractSearchAsyncAction.java:399)
	... 49 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
	at org.elasticsearch.common.util.BigArrays$ObjectArrayWrapper.get(BigArrays.java:401)
	at org.elasticsearch.xpack.ml.aggs.categorization.CategorizeTextAggregator.buildAggregations(CategorizeTextAggregator.java:116)
	at org.elasticsearch.search.aggregations.bucket.BucketsAggregator.buildSubAggsForBuckets(BucketsAggregator.java:179)
	at org.elasticsearch.search.aggregations.bucket.BucketsAggregator.buildAggregationsForFixedBucketCount(BucketsAggregator.java:257)
	at org.elasticsearch.search.aggregations.bucket.range.RangeAggregator.buildAggregations(RangeAggregator.java:534)
	at org.elasticsearch.search.aggregations.AdaptingAggregator.buildAggregations(AdaptingAggregator.java:101)
	at org.elasticsearch.search.aggregations.Aggregator.buildTopLevel(Aggregator.java:159)
	at org.elasticsearch.search.aggregations.AggregatorCollector.doPostCollection(AggregatorCollector.java:47)
	at org.elasticsearch.search.query.QueryPhaseCollector.doPostCollection(QueryPhaseCollector.java:379)
	at org.elasticsearch.search.internal.ContextIndexSearcher.doAggregationPostCollection(ContextIndexSearcher.java:386)
	at org.elasticsearch.search.internal.ContextIndexSearcher.search(ContextIndexSearcher.java:375)
	at org.elasticsearch.search.internal.ContextIndexSearcher.lambda$search$4(ContextIndexSearcher.java:345)
	at org.apache.lucene.search.TaskExecutor$TaskGroup.lambda$createTask$0(TaskExecutor.java:118)
	at java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at org.elasticsearch.common.util.concurrent.TimedRunnable.doRun(TimedRunnable.java:33)
	at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:983)
	at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:26)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.lang.Thread.run(Thread.java:1583)
"""
  },
  "status": 500
}

The buggy line is:

final TokenListCategorizer categorizer = categorizers.get(ordsToCollect[ordIdx]);

It is possible that one of the "ords to collect" doesn't actually have a categorizer, because there are no documents within it. If the empty bucket still has an array element then that's fine, as we handle null on the next line, but if it's beyond the end of the array then it causes an exception.

This problem is not always seen with every search extending into empty buckets, because when a BigArray is resized it may be resized to a bigger size than requested, and the extra capacity may result in the array being big enough to have an entry for each bucket even though we didn't explicitly ask for this:

/** Grow an array to a size that is larger than <code>minSize</code>,
* preserving content, and potentially reusing part of the provided array. */
public <T> ObjectArray<T> grow(ObjectArray<T> array, long minSize) {
if (minSize <= array.size()) {
return array;
}
final long newSize = overSize(minSize, PageCacheRecycler.OBJECT_PAGE_SIZE, RamUsageEstimator.NUM_BYTES_OBJECT_REF);
return resize(array, newSize);
}

@droberts195 droberts195 added >bug :ml Machine learning labels Feb 28, 2024
@elasticsearchmachine
Copy link
Collaborator

Pinging @elastic/ml-core (Team:ML)

@elasticsearchmachine elasticsearchmachine added the Team:ML Meta label for the ML team label Feb 28, 2024
droberts195 added a commit to droberts195/elasticsearch that referenced this issue Mar 5, 2024
Previously the `categorize_text` aggregation could throw an
exception if nested as a sub-aggregation of another aggregation
that produced empty buckets at the end of its results. This
change avoids this possibility.

Fixes elastic#105836
droberts195 added a commit that referenced this issue Mar 6, 2024
…05987)

Previously the `categorize_text` aggregation could throw an
exception if nested as a sub-aggregation of another aggregation
that produced empty buckets at the end of its results. This
change avoids this possibility.

Fixes #105836
droberts195 added a commit to droberts195/elasticsearch that referenced this issue Mar 6, 2024
…astic#105987)

Previously the `categorize_text` aggregation could throw an
exception if nested as a sub-aggregation of another aggregation
that produced empty buckets at the end of its results. This
change avoids this possibility.

Fixes elastic#105836
elasticsearchmachine pushed a commit that referenced this issue Mar 6, 2024
…05987) (#106012)

Previously the `categorize_text` aggregation could throw an
exception if nested as a sub-aggregation of another aggregation
that produced empty buckets at the end of its results. This
change avoids this possibility.

Fixes #105836
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
>bug :ml Machine learning Team:ML Meta label for the ML team
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants