我的索引上有一个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
城市的汇总结果。显然问题是我的字段应该有lowercase
和asciifolding
过滤器才能匹配(São/ sao),但是我不能分析我的字段,因为我不希望有聚合结果例如São
,Paulo
,New
,York
(分析字段会发生这种情况)。
我该怎么办?我尝试了很多与映射/查询/ aggs的组合,但我无法让它工作。
任何帮助将不胜感激。
答案 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"
}
}
}
}