我正在进行分面搜索UI,我要添加的其中一个方面是IP字段的前三个八位字节。
因此,例如,给定IP为“192.168.1.1”,“192.168.1.2”,“192.168.2.1”的文档,我希望显示构面“192.168.1(2)”和“192.168.2”( 1)”。
我可以使用聚合吗?据我所知,范围聚合要求我预定义范围,术语聚合只需要一个字段。
显然,替代方案是我将前三个八位字节编入索引作为一个单独的字段,但我当然希望避免这种情况。
谢谢!
答案 0 :(得分:1)
您可以添加路径层次结构标记器,其范围为“。”以及将令牌化程序设置为您刚刚制作的令牌化程序的自定义分析器。
请参阅此问题的语法:
Elasticsearch - using the path hierarchy tokenizer to access different level of categories
然后您可以聚合术语,您将获得按每个数字组分组的结果
{
"key": "192",
"doc_count": 10
},
{
"key": "192.168",
"doc_count": 10
},
...
在链接的答案中,有一种方法可以排除某些聚合级别。除了具有3个数字级别的结果外,以下内容应排除所有结果。
"aggs": {
"ipaddr": {
"terms": {
"field": "your_ip_addr",
"exclude": ".*",
"include": ".*\\..*\\..*"
}
}