2

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

IllegalArgumentException[默认情况下在文本字段上禁用字段数据。在 [created] 上设置 fielddata=true 以便通过反转倒排索引将 fielddata 加载到内存中。请注意,这可能会占用大量内存。或者使用关键字字段。]

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

4

3 回答 3

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
              }
            }
          }
          ...
          ...
        }
      }
    }
  }
}
于 2017-12-19T10:18:27.077 回答
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官方页面上的详细信息

于 2017-06-09T03:30:03.123 回答
0

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

链接摘录

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

默认情况下,在文本字段上禁用 Fielddata。

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

fielddata1.通过启用text字段来更新映射"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);

于 2020-06-08T18:56:25.160 回答