Elasticsearch:是否有可能不分析分析字段上的聚合查询?

时间:2016-07-19 01:49:56

标签: elasticsearch

我有一些文件以分析形式存储品牌名称:{“name”:“Sam-sung”} {“name”:“Motion:Systems”}。在某些情况下,我希望在时间戳下汇总这些品牌。 我的查询如下,

var t = el.data('toggle');
if (t) {
    a(el);
} else {
    b(el);
}
el.data('toggle',  !t);

但返回结果将是

{
"size": 0,
 "aggs": {
  "filtered_aggs": {
   "filter": {
     "range": {
      "@timestamp":{
         "gte":"2016-07-18T14:23:41.459Z",
        "lte":"2016-07-18T14:53:10.017Z"
      }
    }
  },
  "aggs": {
    "execute_time": {
      "terms": {
        "field": "brands",
         "size": 0
        }
      }
    }
  }
 }
}

但我希望结果是

{
...
 "aggregations": {
  "states": {
     "buckets": [
        {
           "key": "Sam",
           "doc_count": 5
        },
        {
           "key": "sung",
           "doc_count": 5
        },
        {
           "key": "Motion",
           "doc_count": 1
        },
        {
           "key": "Systems",
           "doc_count": 1
        }
      ]
    }
  }
}

有什么方法可以在弹性搜索中对分析的字段进行分析查询?

1 个答案:

答案 0 :(得分:0)

您需要在not_analyzed字段中添加brands子字段,然后在该字段上进行汇总。

PUT /index/_mapping/type
{
   "properties": {
      "brands": {
         "type": "string",
         "fields": {
             "raw": {
                "type": "string",
                "index": "not_analyzed"
             }
         }
      }
   }
}

然后,您需要完全重新索引数据,以便填充新的子字段brands.raw

最后,您可以将查询更改为:

POST index/_search
{
"size": 0,
 "aggs": {
  "filtered_aggs": {
   "filter": {
     "range": {
      "@timestamp":{
         "gte":"2016-07-18T14:23:41.459Z",
        "lte":"2016-07-18T14:53:10.017Z"
      }
    }
  },
  "aggs": {
    "execute_time": {
      "terms": {
        "field": "brands.raw",
         "size": 0
        }
      }
    }
  }
 }
}