【问题标题】:ElasticSearch Java API: Enabling fielddata on text fieldsElasticSearch Java API:在文本字段上启用 fielddata
【发布时间】:2021-03-04 12:25:43
【问题描述】:

我使用 ElasticSearch Java API 创建了一个 ElasticSearch 索引。现在我想对存储在该索引中的数据执行一些聚合,但出现以下错误:

      "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [item] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."

正如link 所建议的那样,为了解决这个问题,我应该在“item”文本字段上启用 fielddata,但是如何使用 ElasticSearch Java API 来做到这一点?

另一种方法可能是将“item”字段映射为keyword,但同样的问题是:如何使用 ElasticSearch Java API 做到这一点?

【问题讨论】:

  • 要将字段item 映射为关键字,不妨试试这个:Put Mapping(但只有创建的新索引才会尊重此映射)
  • 请查看这个答案:Link

标签: java elasticsearch elasticsearch-java-api


【解决方案1】:

对于新索引,您可以通过执行以下操作在创建时设置映射:

CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
String source = // probably read the mapping from a file
createIndexRequest.source(source, XContentType.JSON);
restHighLevelClient.indices().create(createIndexRequest);

映射的格式应与您可以针对其他端点执行的请求具有相同的格式,如下所示:

{
  "mappings": {
    "your_type": {
      "properties": {
        "your_property": {
          "type": "keyword"
        }
      }
    }
  }
}

【讨论】:

    【解决方案2】:

    使用 XContentBuilder,轻松创建 json 字符串来创建或更新映射。好像

    .startObject("field's name")
        .field("type", "text")
        .field("fielddata", true)
    .endObject()
    

    仅使用 IndexRequest 创建新索引或使用 PutMappingRequest 更新旧映射后

    【讨论】:

      【解决方案3】:

      我最近遇到了这个问题,但就我而言,我在执行排序时遇到了这个问题。我已经在另一个类似的问题中发布了这个问题的有效解决方案 -> set field data = true on java elasticsearch

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多