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

cur*_*us1 4 elasticsearch

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

"language" : {
    "type" : "string",
    "index": "analyzed",
    "analyzer" : "standard"
}
Run Code Online (Sandbox Code Playgroud)

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

除聚合外,此属性没有其他用途.我注意到当我在此属性上获得聚合结果时:

{
  "query": {
        "filtered" : {
            "query": { 
                    "match_all": {}
            },
            "filter" : {
                 ...
            }
        }
    },
    "aggregations": {
        "facets": {
            "terms": {
                "field": "language"
            }
        }
    }   
}
Run Code Online (Sandbox Code Playgroud)

存储桶键值为小写.

  "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
      } ]
    }
  }
Run Code Online (Sandbox Code Playgroud)

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

感谢致敬.

Slo*_*ens 8

请在映射中尝试此操作:

"language" : {
    "type" : "string",
    "index": "not_analyzed"
}
Run Code Online (Sandbox Code Playgroud)

每个文档的该字段中的文本将被使用,未经修改,以创建令牌,这些令牌将由您的术语聚合返回.对于您提供的示例值,聚合将逐字返回:

"aggregations": {
   "facets": {
      "buckets": [
         {
            "key": "en zh_CN",
            "doc_count": 1
         }
      ]
   }
}
Run Code Online (Sandbox Code Playgroud)

如果您仍希望在空格上对文本进行标记,则可以尝试在映射中使用空白分析器:

"language": {
   "type": "string",
   "analyzer": "whitespace"
}
Run Code Online (Sandbox Code Playgroud)

然后你的聚合将返回:

"aggregations": {
   "facets": {
      "buckets": [
         {
            "key": "en",
            "doc_count": 1
         },
         {
            "key": "zh_CN",
            "doc_count": 1
         }
      ]
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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