anomaly-detection icon indicating copy to clipboard operation
anomaly-detection copied to clipboard

Exception thrown when agg query is min() on text field

Open yizheliu-amazon opened this issue 4 years ago • 4 comments

Aggregation method:

{
    "aggregation_name": {
        "min": {
            "field": "full_name"
        }
    }
}

GET test-index/_mapping:

{
  "test-index" : {
    "mappings" : {
      "properties" : {
        "feature-0" : {
          "type" : "long"
        },
        "feature-1" : {
          "type" : "long"
        },
        "feature-2" : {
          "type" : "long"
        },
        "feature-3" : {
          "type" : "long"
        },
        "feature-4" : {
          "type" : "long"
        },
        "full_name" : {
          "type" : "text"
        },
        "timestamp" : {
          "type" : "date",
          "format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        }
      }
    }
  }
}

Exception:

com.amazon.opendistroforelasticsearch.ad.common.exception.InternalFailure: Failed to execute phase [query], all shards failed; shardFailures {[GKVjBhpGRXyucjIlGoNwoQ][test-index][0]: RemoteTransportException[[dev-dsk-yizheliu-2a-a1aecd92.us-west-2.amazon.com][127.0.0.1:9300][indices:data/read/search[phase/query]]]; nested: IllegalArgumentException[Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [full_name] in order to load field data by uninverting the inverted index. Note that this can use significant memory.]; }{[GKVjBhpGRXyucjIlGoNwoQ][test-index][1]: RemoteTransportException[[dev-dsk-yizheliu-2a-a1aecd92.us-west-2.amazon.com][127.0.0.1:9300][indices:data/read/search[phase/query]]]; nested: IllegalArgumentException[Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [full_name] in order to load field data by uninverting the inverted index. Note that this can use significant memory.]; }{[GKVjBhpGRXyucjIlGoNwoQ][test-index][2]: RemoteTransportException[[dev-dsk-yizheliu-2a-a1aecd92.us-west-2.amazon.com][127.0.0.1:9300][indices:data/read/search[phase/query]]]; nested: IllegalArgumentException[Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [full_name] in order to load field data by uninverting the inverted index. Note that this can use significant memory.]; }
        at com.amazon.opendistroforelasticsearch.ad.transport.AnomalyResultTransportAction.handleExecuteException(AnomalyResultTransportAction.java:481) [opendistro-anomaly-detection-1.9.0.0.jar:1.9.0.0]
        at com.amazon.opendistroforelasticsearch.ad.transport.AnomalyResultTransportAction.lambda$onFeatureResponse$5(AnomalyResultTransportAction.java:387) [opendistro-anomaly-detection-1.9.0.0.jar:1.9.0.0]
        at org.elasticsearch.action.ActionListener$1.onFailure(ActionListener.java:71) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.action.ActionListener$1.onFailure(ActionListener.java:71) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.action.ActionListener$1.onFailure(ActionListener.java:71) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.action.support.TransportAction$1.onFailure(TransportAction.java:98) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.action.search.AbstractSearchAsyncAction.raisePhaseFailure(AbstractSearchAsyncAction.java:573) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.action.search.AbstractSearchAsyncAction.onPhaseFailure(AbstractSearchAsyncAction.java:551) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.action.search.AbstractSearchAsyncAction.executeNextPhase(AbstractSearchAsyncAction.java:309) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.action.search.AbstractSearchAsyncAction.onPhaseDone(AbstractSearchAsyncAction.java:582) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.action.search.AbstractSearchAsyncAction.onShardFailure(AbstractSearchAsyncAction.java:393) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.action.search.AbstractSearchAsyncAction.access$100(AbstractSearchAsyncAction.java:68) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.action.search.AbstractSearchAsyncAction$1.onFailure(AbstractSearchAsyncAction.java:245) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.action.search.SearchExecutionStatsCollector.onFailure(SearchExecutionStatsCollector.java:73) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.action.ActionListenerResponseHandler.handleException(ActionListenerResponseHandler.java:59) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.action.search.SearchTransportService$ConnectionCountingHandler.handleException(SearchTransportService.java:403) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.transport.TransportService$6.handleException(TransportService.java:639) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.transport.TransportService$ContextRestoreResponseHandler.handleException(TransportService.java:1173) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.transport.TransportService$DirectResponseChannel.processException(TransportService.java:1282) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.transport.TransportService$DirectResponseChannel.sendResponse(TransportService.java:1256) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.transport.TaskTransportChannel.sendResponse(TaskTransportChannel.java:60) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.action.support.ChannelActionListener.onFailure(ChannelActionListener.java:56) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.SearchService.lambda$runAsync$0(SearchService.java:413) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.common.util.concurrent.TimedRunnable.doRun(TimedRunnable.java:44) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:695) [elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) [elasticsearch-7.8.0.jar:7.8.0]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) [?:?]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) [?:?]
        at java.lang.Thread.run(Thread.java:832) [?:?]
Caused by: org.elasticsearch.action.search.SearchPhaseExecutionException: all shards failed
        ... 22 more
Caused by: org.elasticsearch.ElasticsearchException$1: Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [full_name] in order to load field data by uninverting the inverted index. Note that this can use significant memory.
        at org.elasticsearch.ElasticsearchException.guessRootCauses(ElasticsearchException.java:644) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.action.search.AbstractSearchAsyncAction.executeNextPhase(AbstractSearchAsyncAction.java:307) ~[elasticsearch-7.8.0.jar:7.8.0]
        ... 20 more
Caused by: java.lang.IllegalArgumentException: Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [full_name] in order to load field data by uninverting the inverted index. Note that this can use significant memory.
        at org.elasticsearch.index.mapper.TextFieldMapper$TextFieldType.fielddataBuilder(TextFieldMapper.java:763) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.index.fielddata.IndexFieldDataService.getForField(IndexFieldDataService.java:116) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.index.query.QueryShardContext.getForField(QueryShardContext.java:227) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.support.ValuesSourceConfig.getMappingFromRegistry(ValuesSourceConfig.java:170) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.support.ValuesSourceConfig.internalResolve(ValuesSourceConfig.java:139) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.support.ValuesSourceConfig.resolve(ValuesSourceConfig.java:68) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.support.ValuesSourceAggregationBuilder.resolveConfig(ValuesSourceAggregationBuilder.java:362) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.support.ValuesSourceAggregationBuilder.doBuild(ValuesSourceAggregationBuilder.java:348) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.support.ValuesSourceAggregationBuilder$LeafOnly.doBuild(ValuesSourceAggregationBuilder.java:92) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.AbstractAggregationBuilder.build(AbstractAggregationBuilder.java:139) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.AggregatorFactories$Builder.build(AggregatorFactories.java:335) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.AggregatorFactory.<init>(AggregatorFactory.java:190) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.support.ValuesSourceAggregatorFactory.<init>(ValuesSourceAggregatorFactory.java:38) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.bucket.range.AbstractRangeAggregatorFactory.<init>(AbstractRangeAggregatorFactory.java:81) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.bucket.range.DateRangeAggregatorFactory.<init>(DateRangeAggregatorFactory.java:41) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.bucket.range.DateRangeAggregationBuilder.innerBuild(DateRangeAggregationBuilder.java:330) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.bucket.range.DateRangeAggregationBuilder.innerBuild(DateRangeAggregationBuilder.java:40) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.support.ValuesSourceAggregationBuilder.doBuild(ValuesSourceAggregationBuilder.java:349) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.support.ValuesSourceAggregationBuilder.doBuild(ValuesSourceAggregationBuilder.java:43) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.AbstractAggregationBuilder.build(AbstractAggregationBuilder.java:139) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.aggregations.AggregatorFactories$Builder.build(AggregatorFactories.java:335) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.SearchService.parseSource(SearchService.java:890) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.SearchService.createContext(SearchService.java:681) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:631) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:428) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.SearchService.access$200(SearchService.java:135) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.SearchService$2.lambda$onResponse$0(SearchService.java:395) ~[elasticsearch-7.8.0.jar:7.8.0]
        at org.elasticsearch.search.SearchService.lambda$runAsync$0(SearchService.java:411) ~[elasticsearch-7.8.0.jar:7.8.0]
        ... 6 more
[2020-08-24T17:56:07,073][INFO ][c.a.o.a.AnomalyDetectorJobRunner] [dev-dsk-yizheliu-2a-a1aecd92.us-west-2.amazon.com] Released lock for AD job jRCjInQBbrxZ6fX41VnI

yizheliu-amazon avatar Aug 25 '20 01:08 yizheliu-amazon

Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead.

Can you paste your index mapping here? I think the exception is caused by text field.

ylwu-amzn avatar Aug 25 '20 18:08 ylwu-amzn

yes. It is caused by the Text field. Mapping is pasted above.

yizheliu-amazon avatar Aug 25 '20 18:08 yizheliu-amazon

yes. It is caused by the Text field. Mapping is pasted above.

We should add some error handling, or use Amit's validation logic to prevent creating feature with wrong field type.

ylwu-amzn avatar Aug 25 '20 18:08 ylwu-amzn

Yeah. Adding to validation logic makes sense to me.

yizheliu-amazon avatar Aug 25 '20 18:08 yizheliu-amazon