Elasticsearch在URL主机名上聚合

use*_*136 4 tokenize elasticsearch

我正在使用包含url的字段索引文档:

[
    'myUrlField' => 'http://google.com/foo/bar'
]
Run Code Online (Sandbox Code Playgroud)

现在我想从弹性搜索中获得的是url字段上的聚合.

curl -XGET 'http://localhost:9200/myIndex/_search?pretty' -d '{
  "facets": {
    "groupByMyUrlField": {
      "terms": {
        "field": "myUrlField"
      }
    }
  }
}'
Run Code Online (Sandbox Code Playgroud)

这是一切都很好,但默认分析仪的标记化领域,这样的网址的每一部分是一个道理,所以我得到安打http,google.com,foobar.但基本上我只对网址的主机名感兴趣google.com.

我可以使用构面按特定标记分组吗?

"field": "myUrlField.0"
Run Code Online (Sandbox Code Playgroud)

或类似的东西?

查询"not_analyzed"索引也不好,因为我想按主机名分组,而不是按唯一网址分组.

希望能够在elasticsearch中执行此操作,而不是在我的客户端代码中执行此操作.谢谢

Adr*_*ler 5

以下是按域聚合网址的方法:

首先,你记号化的完整URL为使用单个标记关键字标记生成器(它的工作方式相同not_analyzed 引擎盖下),那么你提取域与一个正则表达式,使用模式捕获令牌过滤器.最后,由于preserve_original选项,我们丢弃了原始的完整网址令牌.

这导致:

{
  "settings": {
    "analysis": {
      "filter": {
        "capture_domain_filter": {
          "type": "pattern_capture",
          "preserve_original": false,
          "flags": "CASE_INSENSITIVE",
          "patterns": [
            "https?:\/\/([^/]+)"
          ]
        }
      },
      "analyzer": {
        "domain_analyzer": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "capture_domain_filter"
          ]
        }
      }
    }
  },
  "mappings": {
    "weblink": {
      "properties": {
        "url": {
          "type": "string",
          "analyzer": "domain_analyzer"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我们检查我们的网址是如何标记的:

curl -sXGET http://localhost:9200/url_analyzer/_analyze\?analyzer\=domain_analyzer\&pretty -d 'http://en.wikipedia.org/wiki/Wikipedia' | grep token
  "tokens" : [ {
    "token" : "en.wikipedia.org",
Run Code Online (Sandbox Code Playgroud)

这看起来不错,现在让我们使用最新的聚合功能(将在不久的将来弃用facet)按域聚合我们的URL .

curl -XGET "http://localhost:9200/url_analyzer/_search?pretty" -d'
{
  "aggregations": {
    "tokens": {
      "terms": {
        "field": "url"
      }
    }
  }
}'
Run Code Online (Sandbox Code Playgroud)

输出:

"aggregations" : {
    "tokens" : {
      "buckets" : [ {
        "key" : "en.wikipedia.org",
        "doc_count" : 2
      }, {
        "key" : "www.elasticsearch.org",
        "doc_count" : 1
      } ]
    }
Run Code Online (Sandbox Code Playgroud)

如果您想在搜索域时避免完全匹配,可以从这里进一步在此基础上应用额外的木瓦标记过滤器以匹配诸如"en.wikipedia","wikipedia.org"之类的查询.