在java elasticsearch上设置字段数据= true

时间:2017-06-08 23:48:20

标签: elasticsearch javaquery

通过Eclipse运行java弹性搜索查询。在测试时出现此错误,我无法在API中找到告诉我如何将此字段数据设置为true的任何位置

  

IllegalArgumentException [在文本字段上禁用Fielddata   默认。在[created]上设置fielddata = true以便加载fielddata   通过反转倒置索引来记忆。但请注意,这可以   使用重要记忆。或者,也可以使用关键字字段。]

有谁知道如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

您必须修改索引映射属性:

try (XContentBuilder jsonBuilder = XContentFactory.jsonBuilder()) {
    final XContentBuilder builder = jsonBuilder
            .startObject()
              .startObject("your_type")
                .startObject("properties")
                  .startObject("your_field")
                    .field("type", "text")
                    .field("fielddata", true)/*setting fielddata*/
                  .endObject()
                .endObject()
              .endObject()
            .endObject();

    client.admin().indices().preparePutMapping("your_index")
            .setType("your_type")
            .setSource(builder)/*also there are overloads for setSource()*/
            .get();
}

String source = "{\"your_type\":{\"properties\":{\"your_field\":{\"type\":\"text\",\"fielddata\":true}}}}";
client.admin().indices().preparePutMapping("your_index)
        .setType("your_type")
        .setSource(source, XContentType.JSON)
        .get();

<强>结果:

{
  "your_index": {
    "aliases": {},
    "mappings": {
      "your_type": {
        "properties": {
          ...
          ...
          "your_field": {
            "type": "text",
            "fielddata": true,
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
          ...
          ...
        }
      }
    }
  }
}

答案 1 :(得分:0)

在Elasticsearch 5.0中,String字段分为两部分 - TextKeyword。如果该属性应该被分析,则您希望将String字段迁移到Text,如果不是,则将其迁移到Keyword

查看你的类型映射 - 如果你有这样的属性 -

{
  "your_field": {
    "type" "string",
    "index": "not_analyzed"
  }
}

你想把它转换成这个 -

{
  "your_field": {
    "type" "keyword",
    "index": true
  }
}

同样地,如果你的财产应该被分析,你就像这样 -

{
  "your_field": {
    "type" "string",
    "index": "analyzed"
  }
}

然后你想把它转换成这个 -

{
  "your_field": {
    "type" "text",
    "index": true
  }
}

有关Elasticsearch official page

的详情

答案 2 :(得分:0)

我最近遇到了此问题,但就我而言,执行排序时遇到了此问题。

link的摘录

默认情况下,大多数字段都已编入索引,这使它们可搜索。但是,脚本中的排序,聚合和访问字段值需要与搜索不同的访问模式。

默认情况下,文本字段中的字段数据是禁用的。

我们可以通过两种方法解决这个问题

1。通过在fielddata字段上将text的{​​{1}}启用为"fielddata": true

来更新映射
PUT your_index/_mapping
{
  "properties": {
    "my_field": { 
      "type":     "text",
      "fielddata": true
    }
  }
}

2。将.keyword作为your_field.keyword附加到字段以进行汇总,排序。

在以前的方法中,我们必须执行重新索引编制,这有时对于大索引来说是一个繁琐的过程。对于此类情况,以下解决方案将是更易于实施的解决方案。

ES查询:

GET /your_index/_search
{
  "query": {
    "match_all": {}
  },
   "sort":[
      {
         "your_field.keyword":{
            "order":"asc"
         }
      }
   ]
}

Java代码

SearchRequest searchRequest = new SearchRequest("your_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
//Appending the .keyword to the sorting field
FieldSortBuilder fieldSortBuilder = SortBuilders.fieldSort("your_field"+".keyword");
fieldSortBuilder.order(SortOrder.ASC);
searchSourceBuilder.sort(fieldSortBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);