Агрегирование количества почтовых доменов, использующих elastisearch - PullRequest
0 голосов
/ 30 мая 2018

В моем индексе есть следующие документы:

{
    "name":"rakesh"
    "age":"26"
    "email":"rakesh@gmail.com"
}

{
    "name":"sam"
    "age":"24"
    "email":"samjoe@elastic.com"
}

{
    "name":"joseph"
    "age":"26"
    "email":"joseph@gmail.com"
}

{
    "name":"genny"
    "age":"24"
    "email":"genny@hotmail.com"
}

Теперь мне нужно получить количество всех почтовых доменов.Например:

@gmail.com:2,
@hotmail.com:1,
@elastic.com:1

с использованием упругих поисковых совокупностей.

Я могу найти записи, соответствующие данному запросу.Но мне нужно иметь счетчик каждого домена.

Заранее спасибо за вашу помощь.

1 Ответ

0 голосов
/ 30 мая 2018

Этого легко достичь, создав подполе, которое будет содержать только имя домена электронной почты.Сначала создайте индекс с помощью соответствующего анализатора:

PUT my_index
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "email_domain_analyzer": {
            "type": "pattern",
            "pattern": "(.+)@",
            "lowercase": true
          }
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "email": {
          "type": "text",
          "fields": {
            "domain": {
              "type": "text",
              "fielddata": true,
              "analyzer": "email_domain_analyzer"
            }
          }
        }
      }
    }
  }
}

Затем создайте свои документы:

POST my_index/doc/_bulk
{ "index": {"_id": 1 }}
{ "name":"rakesh", "age":"26", "email":"rakesh@gmail.com" }
{ "index": {"_id": 2 }}
{ "name":"sam", "age":"24", "email":"samjoe@elastic.com" }
{ "index": {"_id": 3 }}
{ "name":"joseph", "age":"26", "email":"joseph@gmail.com" }
{ "index": {"_id": 4 }}
{ "name":"genny", "age":"24", "email":"genny@gmail.com" }

И, наконец, вы можете агрегировать в поле email.domain, и вы получите точночто нужно:

POST my_index/_search
{
  "size": 0,
  "aggs": {
    "domains": {
      "terms": {
        "field": "email.domain"
      }
    }
  }
}
...