I need help asap please for fieldData

I am wrote this code to make aggregation :

public static void createIndex() throws IOException {

    CreateIndexRequest request = new CreateIndexRequest("testindexcreate2");
    request.settings(Settings.builder()
            .put("index.number_of_shards", 3)
            .put("index.number_of_replicas", 2)
    );

    XContentBuilder builder = XContentFactory.jsonBuilder();
    builder.startObject();
    {
        builder.startObject("properties");
        {
            builder.startObject("message");
            {
                builder.field("type", "text");
                builder.field("fielddata",true);
            }
            builder.endObject();
        }
        builder.endObject();
    }
    builder.endObject();
    request.mapping(String.valueOf(builder));
    CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);


}

public static void getAggregation() throws IOException {
MinAggregationBuilder aggregation =
AggregationBuilders
.min("agg")
.field("salary");

    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    SearchRequest searchRequest = new SearchRequest();
    searchSourceBuilder.aggregation(aggregation);
    searchRequest.source(searchSourceBuilder);

    SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
    System.out.println(searchResponse);
    Min agg = searchResponse.getAggregations().get("agg");


    System.out.println(agg.getValue());
}

**** The problem is fielddata must equal true , i already define it equal true above ,, what the problem ?

Please help me

Your indexing code and search code use different field names?
"message" vs "salary".
Asking for the minimum of salary makes sense as opposed to asking for the min of message.

insted of salary , i need to define field like this

XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
builder.startObject("properties");
{
builder.startObject("message");
{
builder.field("id", "text");
builder.field("fielddata",true);
}
builder.startObject("");
{
builder.field("age", "text");
builder.field("fielddata",true);
}
{
builder.field("salary", "text");
builder.field("fielddata",true);
}
builder.endObject();
}
builder.endObject();
}

I'm not sure why you would consider age and salary as a text type instead of numbers.

i make like this

public static void insertNewRecord(TestIndexDoc indexDoc) throws IOException {

    Map<String, Object> dataMap = new HashMap<String, Object>();
    dataMap.put("id", indexDoc.getId());
    dataMap.put("age", indexDoc.getAge());
    dataMap.put("salary",indexDoc.getSalary());
    IndexRequest indexRequest = new IndexRequest( "testindexcreate5")
            .source(dataMap);
    IndexResponse response = restHighLevelClient.index(indexRequest , RequestOptions.DEFAULT);
}

and aggregation code :

public static void getAggregation() throws IOException {
MinAggregationBuilder aggregation =
AggregationBuilders
.min("agg")
.field("salary");

    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    SearchRequest searchRequest = new SearchRequest();
    searchRequest.indices("testindexcreate5");
    searchSourceBuilder.aggregation(aggregation);
    searchRequest.source(searchSourceBuilder);

    SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
    Min agg = searchResponse.getAggregations().get("agg");


    System.out.println(agg.getValue());
}

its same problem ?

this code for create index

public static void createIndex() throws IOException {

    CreateIndexRequest request = new CreateIndexRequest("testindexcreate5");
    request.settings(Settings.builder()
            .put("index.number_of_shards", 3)
            .put("index.number_of_replicas", 2)
    );

    XContentBuilder builder = XContentFactory.jsonBuilder();
    builder.startObject();
    {
       // builder.startObject("properties");
        //{
            builder.startObject("id");
            {
                builder.field("type", "number");
                builder.field("fielddata",true);
            }
            builder.endObject();
            builder.startObject("age");
            {
                builder.field("type", "number");
                builder.field("fielddata",true);
            }
            builder.endObject();
            builder.startObject("salary");
            {
                builder.field("type", "number");
                builder.field("fielddata",true);
            }
            builder.endObject();
        //}
     //   builder.endObject();
    }
    builder.endObject();
    request.mapping(String.valueOf(builder));
    CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);


}

People very rarely need to use fieldData and I don't see any particular reason why you need it here.

See https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html#before-enabling-fielddata

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.