Elasticsearch使用过滤器对未分析字段进行聚合

时间:2016-06-28 00:01:01

标签: elasticsearch

我的索引上有一个not analyzed字段:

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

我有如下聚合:

"aggs": {
    "city": {
        "terms": {
            "field": "city"
        }
    }
}

给我一​​个像这样的输出:

"aggregations": {
    "city": {
        "doc_count_error_upper_bound": 51,
        "sum_other_doc_count": 12478,
        "buckets": [
            {
                "key": "New York",
                "doc_count": 28420
            },
            {
                "key": "London",
                "doc_count": 23456
            },
            {
                "key": "São Paulo",
                "doc_count": 12727
            }
        ]
    }
}

我需要在处理聚合之前添加match_phrase_prefix查询,以根据用户文本过滤我的结果,如下所示:

{
    "size": 0,
    "query": {
        "match_phrase_prefix": {
            "city": "sao"
        }
    },
    "aggs": {
        "city": {
                "terms": {
                    "field": "city"
                }
            }
    }
}

结果是......什么都没有!

"aggregations": {
    "city": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": []
    }
}

我期待São Paulo城市的汇总结果。显然问题是我的字段应该有lowercaseasciifolding过滤器才能匹配(São/ sao),但是我不能分析我的字段,因为我不希望有聚合结果例如SãoPauloNewYork(分析字段会发生这种情况)。

我该怎么办?我尝试了很多与映射/查询/ aggs的组合,但我无法让它工作。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:6)

由于not_analyzed,查询字词为case-sensitive。 您可以使用city analyzed and non-analyzed fields上的multi-field映射。

示例:

put <index>/<type>/_mapping
{
   "properties": {
      "city": {
         "type": "string",
         "fields": {
            "raw": {
               "type": "string",
               "index": "not_analyzed"
            }
         }
      }
   }
}

post <index>/<type>/_search
{
    "size": 0,
    "query": {
        "match_phrase_prefix": {
            "city": "Sao"
        }
    },
    "aggs": {
        "city": {
                "terms": {
                    "field": "city.raw"
                }
            }
    }
}