ElasticSearch Java API:在文本字段上启用fielddata

时间:2017-11-30 17:32:44

标签: java elasticsearch elasticsearch-java-api

我使用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执行此操作?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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 :(得分:0)

我最近遇到了此问题,但就我而言,执行排序时遇到了此问题。我在另一个类似的问题-> set field data = true on java elasticsearch

中发布了该问题的有效解决方案