Elasticsearch:如何使聚合字段不改变值的大小写

Elasticsearch: how to make an aggregation field not change the case of values

我有聚合字段的以下映射:

"language" : {
    "type" : "string",
    "index": "analyzed",
    "analyzer" : "standard"
}

此 属性 中示例文档的值可能如下所示:"en zh_CN"

这个属性除了聚合没有别的用处。我注意到当我得到这个 属性:

的聚合结果时
{
  "query": {
        "filtered" : {
            "query": { 
                    "match_all": {}
            },
            "filter" : {
                 ...
            }
        }
    },
    "aggregations": {
        "facets": {
            "terms": {
                "field": "language"
            }
        }
    }   
}

存储桶键值是小写的。

  "aggregations" : {
    "facets" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [ {
        "key" : "zh_cn",
        "doc_count" : 2
      }, {
        "key" : "en",
        "doc_count" : 1
      } ]
    }
  }

如何在不让 ES 降低其值的情况下实现我的聚合目标。我觉得我可能需要为此 属性 更改映射,但不确定如何更改。

感谢和问候。

在您的映射中试试这个:

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

每个文档的该字段中的文本将未经修改地用于创建标记,这些标记将由您的术语聚合 return 编辑。对于您提供的示例值,聚合将 return 逐字记录:

"aggregations": {
   "facets": {
      "buckets": [
         {
            "key": "en zh_CN",
            "doc_count": 1
         }
      ]
   }
}

如果您仍然希望文本在空白处被标记化,您可以尝试在映射中使用 whitespace analyzer

"language": {
   "type": "string",
   "analyzer": "whitespace"
}

那么您的聚合将 return:

"aggregations": {
   "facets": {
      "buckets": [
         {
            "key": "en",
            "doc_count": 1
         },
         {
            "key": "zh_CN",
            "doc_count": 1
         }
      ]
   }
}

这是我用来测试这两个例子的代码:

http://sense.qbox.io/gist/a7b3c7d50c7012537c50d576d03940b28b5f8793