嵌套字段上的聚合,嵌套字段属性上的fielddata = true

时间:2019-11-21 04:49:20

标签: elasticsearch elasticsearch-5

我有这种格式的json

{
"id":1,
"name":"CBG",
"studDetails":{
"address":"Banglore"
}
}

尝试在studDetails.address上进行汇总,得到此错误

Fielddata is disabled on text fields by default. Set fielddata=true on [studDetails.address].

在curl命令下面尝试设置为true,但不起作用。

curl -XPUT -H "Content-Type: application/json" http://localhost:9200/student -d '{
  "mappings": {
    "type": {
      "properties": {
        "studDetails.address": {
          "type": "keyword",
          "fielddata": true
        }
      }
    }
  }
}'

2 个答案:

答案 0 :(得分:0)

对不起,我在聚合api'student.studDetails.address'中缺少标准路径

 srb.addAggregation(AggregationBuilders.nested("agg1", "studDetails").
                subAggregation(AggregationBuilders.terms("agg2").field("student.studDetails.address")));

答案 1 :(得分:0)

请勿使用fieldata:true进行汇总,这可能会导致性能问题。

字段数据会占用很多堆空间,尤其是在加载高基数的文本字段时。字段数据一旦加载到堆中,就在该段的生命周期内保持在那里。同样,加载字段数据是一个昂贵的过程,可能导致用户遇到延迟问题。这就是默认情况下禁用字段数据的原因。

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

改为使用关键字。

假设您的映射如下:

   "studDetails":{
         "type":"nested",
           "properties":{
               "address":{
                   "type": "text",
                    "fields": {
                       "keyword": {
                         "type": "keyword",
                        "ignore_above": 256
                       }
                   }
               }
           }
       }

然后您的查询应如下所示:

srb.addAggregation(AggregationBuilders.nested("agg1", 
"studDetails").subAggregation(AggregationBuilders.terms("agg2").field("studDetails.address.keyword")))

希望这会有所帮助