简体   繁体   中英

How to enable field data in elasticsearch

I'm trying to enable field data in elasticsearch, but I'm still gettting the same error. Can anyone tell me what I'm missing?

.NET Code

var resByApp = client.Search<ApiCall>(s => s.Aggregations(a => a
                    .Filter("my_filter", f => f
                          .Filter(fd => fd
                               .DateRange(r => r
                                   .GreaterThan(DateTime.UtcNow.ToBeginOfDay().AddDays(-DefaultDaysRange))
                                   .Field(p => p.CreatedDate)
                               )
                               &&
                               fd.Term(t => t.ServiceId, serviceId)
                           )
                    .Aggregations(ag => ag
                              .Terms("app_agg", st => st
                                  .Field(af => af.AppId))
                              )
                          )));

DebugInformation:

Invalid NEST response built from a unsuccessful low level call on POST: /abc_apicalls/apicall/_search
# Audit trail of this API call:
 - [1] BadResponse: Node: http://localhost:9200/ Took: 00:00:00.0459990
# ServerError: ServerError: 400Type: search_phase_execution_exception Reason: "all shards failed" CausedBy: "Type: illegal_argument_exception Reason: "Fielddata is disabled on text fields by default. Set fielddata=true on [appId] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.""
# OriginalException: System.Net.WebException: The remote server returned an error: (400) Bad Request.
   at System.Net.HttpWebRequest.GetResponse()
   at Elasticsearch.Net.HttpConnection.Request[TReturn](RequestData requestData) in C:\Users\russc\source\git\elasticsearch-net-5.x\src\Elasticsearch.Net\Connection\HttpConnection.cs:line 164
# Request:
{"aggs":{"my_filter":{"filter":{"bool":{"must":[{"range":{"createdDate":{"gt":"2017-03-26T00:00:00"}}},{"term":{"serviceId":{"value":2}}}]}},"aggs":{"app_agg":{"terms":{"field":"appId"}}}}}}
# Response:
{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"Fielddata is disabled on text fields by default. Set fielddata=true on [appId] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."}],"type":"search_phase_execution_exception","reason":"all shards failed","phase":"query","grouped":true,"failed_shards":[{"shard":0,"index":"abc_apicalls","node":"oYXnz0dhTZ6Bs5ZpspH1hg","reason":{"type":"illegal_argument_exception","reason":"Fielddata is disabled on text fields by default. Set fielddata=true on [appId] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."}}],"caused_by":{"type":"illegal_argument_exception","reason":"Fielddata is disabled on text fields by default. Set fielddata=true on [appId] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."}},"status":400}

What I tried:

PUT abc_apicalls/apicall/text
{
  "properties": {
    "appId": { 
      "type":     "text",
      "fielddata": true
    }
  }
}

This is the results for GET abc_apicalls

{
  "abc_apicalls": {
    "aliases": {},
    "mappings": {
      "apicall": {
        "properties": {
          "appId": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "properties": {
            "properties": {
              "appId": {
                "properties": {
                  "fielddata": {
                    "type": "boolean"
                  },
                  "type": {
                    "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  }
                }
              }
            }
          },
    ...
  }
}

Resources: https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html

The type is wrong, this is the proper way to enable a field data

PUT abc_apicalls/_mapping/apicall
{
   "apicall": {
      "properties": {
        "appId": {
          "type": "text",
          "fielddata": true
        }
      }
   }
}

I using Nest 5.4 and do this put mapping by following code:

_client.Map<AccountDoc>(m => m.Index("Your_Index_Name").Properties(p =>
            p.Text(t => t.Name(n => n.Your_Field_Name).Fielddata(true))));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM