如何在Java代码中修复此ElasticSearch Fielddata异常?

时间:2018-05-15 19:45:14

标签: java elasticsearch

我正在研究Java代码,以便在ElasticSearch上创建索引和查询。 尝试使用count,sort API时,我不断收到此异常:

{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"Fielddata is disabled on text fields by default. Set fielddata=true ......

如何将Fielddata设置为true?

我使用BulkRequest创建索引,如何将映射添加到BulkRequest?

以下是创建索引的代码:

BulkRequest request=new BulkRequest();

    try {
        BufferedReader br=new BufferedReader(new FileReader(fileName));
        String line;
        while((line=br.readLine())!=null) {
            request.add(new IndexRequest(indexName, type).source(line, XContentType.JSON)); ;
            BulkResponse bulkresp=client.bulk(request);
            afterBulk(request,bulkresp);
        }
        catch (IOException e) {
            e.printStackTrace();
        }

2 个答案:

答案 0 :(得分:0)

首先,让我们转到问题的根源,你想对文本字段进行排序操作,这需要你启用fielddata。

  

在启用fielddata之前,请考虑使用文本字段的原因   用于聚合,排序或脚本。它通常不会   这样做的意义。

     

在编制索引之前会分析文本字段,以便像纽约这样的值   可以通过搜索 york 找到。术语聚合   当您执行此字段时,将返回存储桶和约克存储桶   可能想要一个名为纽约的桶。

排序的情况也是如此。你如何在这个有很多术语的领域进行排序。

  

相反,您应该有一个 text 字段用于全文搜索,并且   未经分析的关键字字段,其中 doc_values 已启用聚合,   如下

{
  "mappings": {
    "_doc": {
      "properties": {
        "my_field": { 
          "type": "text",
          "fields": {
            "keyword": { 
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

对于问题的其他部分 - 您需要查看CreateIndexRequest,它允许明确指定映射。最有可能的是,现在你正在使用动态的,这就是为什么fielddata会给你带来问题的原因。有关如何使用CreateIndexRequest的更多信息 - https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high-create-index.html#java-rest-high-create-index

答案 1 :(得分:0)

感谢您回答我的问题。 我想对日期字段进行排序,但我没有将映射添加到索引,所有字段都自动设置为文本。 将映射添加到索引后,问题得以解决。