IP的前三个八位字节的术语聚合

时间:2016-08-10 14:00:19

标签: elasticsearch

我正在进行分面搜索UI,我要添加的其中一个方面是IP字段的前三个八位字节。

因此,例如,给定IP为“192.168.1.1”,“192.168.1.2”,“192.168.2.1”的文档,我希望显示构面“192.168.1(2)”和“192.168.2”( 1)”。

我可以使用聚合吗?据我所知,范围聚合要求我预定义范围,术语聚合只需要一个字段。

显然,替代方案是我将前三个八位字节编入索引作为一个单独的字段,但我当然希望避免这种情况。

谢谢!

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": ".*\\..*\\..*"
     }
}

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-pathhierarchy-tokenizer.html