【问题标题】:ElasticSearch 5.x Sorting on Text Field IssueElasticSearch 5.x 对文本字段问题进行排序
【发布时间】:2017-01-09 02:23:03
【问题描述】:

我了解这是一项新更改,但我看不出此映射有什么问题。这是通过 _mapping 调用从 ElasticSearch 中注册的字段映射得到的:

"key": {
    "type": "text",
    "fields": {
        "keyword": {
            "type": "keyword",
            "ignore_above": 256
        }
    }
}

当我使用“关键”字段进行排序时,我得到了这个异常。我也尝试过添加 fieldData=true,但这也没有用。

Caused by: RemoteTransportException[[_6qwpaI][127.0.0.1:9300][indices:data/read/search[phase/query]]]; nested: IllegalArgumentException[Fielddata is disabled on text fields by default. Set fielddata=true on [key] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.];
Caused by: java.lang.IllegalArgumentException: Fielddata is disabled on text fields by default. Set fielddata=true on [key] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.
    at org.elasticsearch.index.mapper.TextFieldMapper$TextFieldType.fielddataBuilder(TextFieldMapper.java:335)
    at org.elasticsearch.index.fielddata.IndexFieldDataService.getForField(IndexFieldDataService.java:111)
    at org.elasticsearch.index.query.QueryShardContext.getForField(QueryShardContext.java:167)
    at org.elasticsearch.search.sort.FieldSortBuilder.build(FieldSortBuilder.java:281)
    at org.elasticsearch.search.sort.SortBuilder.buildSort(SortBuilder.java:151)
    at org.elasticsearch.search.SearchService.parseSource(SearchService.java:678)
    at org.elasticsearch.search.SearchService.createContext(SearchService.java:536)
    at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:502)
    at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:243)
    at org.elasticsearch.action.search.SearchTransportService.lambda$registerRequestHandler$6(SearchTransportService.java:276)
    at org.elasticsearch.transport.TransportRequestHandler.messageReceived(TransportRequestHandler.java:33)
    at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:69)
    at org.elasticsearch.transport.TransportService$6.doRun(TransportService.java:550)
    at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:527)
    at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

起初我认为这可能与使用字段(例如 key.keyword)有关,但由于我没有这样做,所以我看不出有任何原因导致这不起作用。

我对 ElasticSearch 5.x 还很陌生,而且该文档自相矛盾,所以我希望有人能指出我正确的方向。这就是我所指的:

https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html

我基本上是在尝试实现与在 5.x 之前有效的原始映射相同的效果:

"mapping": {
    "type": "string",
    "fields": {
        "raw": {
            "type": "string",
            "ignore_above": 256
        },
        "english": {
            "type": "string",
            "analyzer": "english"
        }
    }
}

顺便说一句,我认为关键字字段是自动生成的,因为我什至没有在我的映射中定义它。

【问题讨论】:

  • 你能解决这个问题吗?我面临着类似的问题:(
  • 看看下面的答案,看看它是否对您的情况有帮助。

标签: sorting search elasticsearch types mapping


【解决方案1】:

将此设置用于 5.x。 "keyword" 是未分析字符串的新类型。

{
   "mappings": {
     "doc": {
       "dynamic_templates": [
         {
           "strings": {
             "match_mapping_type": "string",
             "mapping": {
               "type": "text",
               "fields": {
                 "raw": {
                   "type": "keyword",
                   "ignore_above": 256
                 },
                 "english": {
                   "type": "text",
                   "analyzer": "english"
                 }
               }
             }
           }
         }
       ]
     }
   }
 }

这是我在 ElasticSearch 论坛上从 Lee Hinman 那里得到的解释。

如果你索引一个没有映射的字符串,5.0+ 中的 ES 现在会自动 创建文本版本和关键字版本(在 .keyword 下) 字段。

这实际上是相当令人困惑的一些 match_mapping_type 不理解值“文本”。

这有一个断开,“动态”类型用于 match_mapping_type 是字段的类型,不一定是ES 类型。例如,match_mapping_type 只支持“long”,不支持 “整数”,因为它映射到数据类型而不是 ES 类型。所以 即使 ES 本身使用“文本”和“关键字”,数据类型也是 仍然是一个“字符串”。

我同意这令人困惑,这里有一个 PR: https://github.com/elastic/elasticsearch/pull/17285 为 5.0+ 添加 为此的弃用日志记录,我打开了 https://github.com/elastic/elasticsearch/pull/22090 所以 6.0 会抛出 使用无法识别的类型时出现异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多