ElasticSearch - индексация URL-адресов и агрегирование на доменах - PullRequest
0 голосов
/ 13 октября 2019

Аналогично этому вопросу Агрегирование Elasticsearch по URL-адресу хоста

Я хочу хранить URL-адреса и иметь возможность агрегировать по доменам

С помощью ES6 у меня есть следующееопределено отображение

PUT /test
{
  "settings": {
    "analysis": {
      "filter": {
        "url_domains": {
          "type": "pattern_capture",
          "preserve_original" : false,
          "patterns": [
            "https?:\/\/([^/]+)"
          ]
        }
      },
      "analyzer": {
        "url": {
          "tokenizer": "uax_url_email",
          "filter": [
            "url_domains",
            "lowercase",
            "unique"
          ]
        },
        "full_url": {
          "tokenizer": "uax_url_email",
          "filter": ["lowercase", "stop"]
        }
      }
    }
  },
  "mappings": {
    "urls": {
      "properties": {
        "url": {
          "type": "text",
          "fielddata" : true,
          "fields": {
            "domain": {
              "type": "text",
              "fielddata" : true,
              "analyzer": "url"
            },
            "full": { 
              "type":  "text",
              "fielddata" : true,
              "analyzer": "full_url"
            }
          }
        }
      }
    }
  }
}

Затем я загружаю следующие данные

POST /test/urls/_bulk
{"index":{"_id":"1"}}
{"url": "http://gmail1.com/hello/world"}
{"index":{"_id":"2"}}
{"url": "https://gmail2.com/hello"}
{"index":{"_id":"3"}}
{"url": "http://gmail3.com/"}
{"index":{"_id":"4"}}
{"url": "https://gmail4.com"}
{"index":{"_id":"5"}}
{"url": "https://www.gmail5.com"}
{"index":{"_id":"6"}}
{"url": "www.gmail6.coom"}
{"index":{"_id":"7"}}
{"url": "www.gmail7.co.uk/hello"}

Когда я выполняю следующий запрос

GET /test/urls/_search
{
  "size": 0,
  "query": {
    "match_all": {}
  }, 
  "aggs": {
    "by_domain": {
      "terms": {
        "field": "url.domain",
        "size": 10
      }
    }
  }
}

Возвращаются следующие агрегации:

  "aggregations": {
    "by_domain": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "coom",
          "doc_count": 1
        },
        {
          "key": "gmail1.com",
          "doc_count": 1
        },
        {
          "key": "gmail2.com",
          "doc_count": 1
        },
        {
          "key": "gmail3.com",
          "doc_count": 1
        },
        {
          "key": "gmail4.com",
          "doc_count": 1
        },
        {
          "key": "www.gmail5.com",
          "doc_count": 1
        },
        {
          "key": "www.gmail6",
          "doc_count": 1
        },
        {
          "key": "www.gmail7.co.uk/hello",
          "doc_count": 1
        }
      ]
    }
  }

После запуска Analyzer я вижу, что документы 6 и 7 не обрабатываются как URL, а имеют тип ALPHANUM.

Как получить правильно извлеченные домены документов 6 и 7

1 Ответ

0 голосов
/ 13 октября 2019

Немного упорства окупились! Изменен шаблон для этого:

       "patterns": [
            "https?:\/\/([^/]+)",
            "(www[^/]+)"
          ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...