Статьи

Что особенного в этом?

Я уже несколько раз использую Elasticsearch для аналитики данных Твиттера для конференций . Популярные хэштеги и упоминания, которые можно извлечь с помощью фасетов, могут показать, что горячо на конференции. Но вы можете пойти еще дальше и посмотреть, что делает каждый хэштег особенным. В этом посте я хотел бы показать вам существенную агрегацию терминов, которая доступна в Elasticsearch 1.1. Я использую твиты прошлых лет Devoxx, поскольку они содержат достаточно документов, чтобы поиграть.

Скопления

Elasticsearch 1.0 представил агрегаты , которые можно использовать аналогично фасетам, но гораздо более мощные. Чтобы понять, почему они полезны, давайте сделаем шаг назад и посмотрим на аспекты, которые часто используются для извлечения статистических значений и распределений. Одним из полезных примеров для фасетов является общее количество хэштегов:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
{
    "size": 0
    "facets": {
       "hashtags": {
          "terms": {
             "field": "hashtag.text",
             "size": 10,
             "exclude": [
                "devoxx", "dv13"
             ]
          }
       }
    }
}'

Мы запрашиваем фасет с именем hashtags, который использует термины hashtag.text и возвращает 10 верхних значений с счетчиками. Мы исключаем хэштеги devoxx и dv13, так как они очень часты. Это отрывок результата с популярными хэштегами:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
"facets": {
      "hashtags": {
         "_type": "terms",
         "missing": 0,
         "total": 19219,
         "other": 17908,
         "terms": [
            {
               "term": "dartlang",
               "count": 229
            },
            {
               "term": "java",
               "count": 216
            },
            {
               "term": "android",
               "count": 139
            },
    [...]

Помимо статистической информации, которую мы здесь извлекаем, фасеты часто используются для уточнения результатов поиска. Обычно используется для отображения категорий или функций продуктов на сайтах электронной коммерции, например.

Начиная с Elasticsearch 1.0, вы можете иметь такое же поведение, используя одну из новых агрегаций, в данном случае агрегацию терминов :

01
02
03
04
05
06
07
08
09
10
11
12
{
    "size" : 0,
    "aggs" : {
        "hashtags" : {
            "terms" : {
                "field" : "hashtag.text",
                "exclude" : "devoxx|dv13"
            }
        }
    }
}'

Вместо запроса фасетов мы теперь запрашиваем агрегирование терминов для поля hashtag.text. Исключение теперь основано на регулярном выражении, а не на списке. Результат выглядит аналогично возвращаемым значениям фасета:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
"aggregations": {
      "hashtags": {
         "buckets": [
            {
               "key": "dartlang",
               "doc_count": 229
            },
            {
               "key": "java",
               "doc_count": 216
            },
            {
               "key": "android",
               "doc_count": 139
            },
    [...]

Каждое значение формирует так называемое ведро, которое содержит ключ и doc_count.

Но агрегаты не только являются заменой граней. Можно объединить несколько агрегаций, чтобы получить больше информации о распределении различных полей. Например, мы можем увидеть пользователей, которые использовали определенный хэштег, добавив второе агрегирование терминов для поля user.screen_name:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
{
    "size" : 0,
    "aggs" : {
        "hashtags" : {
            "terms" : {
                "field" : "hashtag.text",
                "exclude" : "devoxx|dv13"
            },
            "aggs" : {
                "hashtagusers" : {
                    "terms" : {
                        "field" : "user.screen_name"
                    }
                }
            }
        }
    }
}'

Используя эту вложенную агрегацию, мы теперь получаем список сегментов для каждого хэштега. Этот список содержит пользователей, которые использовали хэштег. Это короткая выдержка из хештега #scala:

01
02
03
04
05
06
07
08
09
10
11
12
13
"key": "scala",
               "doc_count": 130,
               "hashtagusers": {
                  "buckets": [
                     {
                        "key": "jaceklaskowski",
                        "doc_count": 74
                     },
                     {
                        "key": "ManningBooks",
                        "doc_count": 3
                     },
    [...]

Мы видим, что есть один пользователь, который отвечает за половину хэштегов. Очень преданный пользователь.

Используя агрегаты, мы можем получить информацию, которую мы не смогли получить только с помощью фасетов. Если вам интересны более подробные сведения об агрегатах в целом или об агрегированных показателях, которые я здесь не затрагивал, Крис Симпсон написал хороший пост об этой функции , есть хороший визуальный пост в блоге Found , еще один здесь и, конечно, на сайте Elasticsearch есть официальная документация .

Существенные условия

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

Значимые термины рассчитываются путем сравнения частоты переднего плана (которая представляет собой интересующую вас группу) с частотой фона (которая для Elasticsearch 1.1 всегда является частотой полного индекса). Это означает, что он будет собирать любые результаты, которые имеют высокую частоту для текущего сегмента, но не для полного индекса.

Для нашего примера мы можем теперь проверить хештеги, которые часто используются с определенным упоминанием. Это не то же самое, что можно сделать с помощью агрегирования терминов. Значимые условия возвращают только те условия, которые часто встречаются для определенного пользователя, но не так часто для всех пользователей. Это то, что Марк Харвуд называет необычайно распространенным .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
{
    "size" : 0,
    "aggs" : {
        "mentions" : {
            "terms" : {
                "field" : "mention.screen_name"
            },
            "aggs" : {
                "uncommonhashtags" : {
                    "significant_terms" : {
                        "field" : "hashtag.text"
                    }
                }
            }
        }
    }
}'

Мы запрашиваем нормальное агрегирование условий для указанных пользователей. Используя вложенную агрегацию visible_terms, мы можем видеть любые хэштеги, которые часто используются с указанным пользователем, но не так часто во всем индексе. Это фрагмент для аккаунта Брайана Гетца:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
               "key": "BrianGoetz",
               "doc_count": 173,
               "uncommonhashtags": {
                  "doc_count": 173,
                  "buckets": [
                     {
                        "key": "lambda",
                        "doc_count": 13,
                        "score": 1.8852860861614915,
                        "bg_count": 33
                     },
                     {
                        "key": "jdk8",
                        "doc_count": 8,
                        "score": 0.7193691737111163,
                        "bg_count": 32
                     },
                     {
                        "key": "java",
                        "doc_count": 21,
                        "score": 0.6601749139630457,
                        "bg_count": 216
                     },
                     {
                        "key": "performance",
                        "doc_count": 4,
                        "score": 0.6574225667412876,
                        "bg_count": 9
                     },
                     {
                        "key": "keynote",
                        "doc_count": 9,
                        "score": 0.5442707998673785,
                        "bg_count": 52
                     },
        [...]

Вы можете видеть, что есть некоторые теги, которые нацелены на лейтмотив Брайана Гетца и не являются общими для всего индекса.

Еще несколько идей, на которые мы могли бы обратить внимание при значительном объединении терминов:

  • Найти пользователей, которые часто используют хэштег.
  • Найдите термины, которые часто используются с определенным хэштегом.
  • Найти термины, которые используются определенным пользователем.

Помимо этой впечатляющей аналитической функции, для поисковых приложений можно использовать важные термины. Полезный пример приведен в самой документации Elasticsearch: если пользователь выполняет поиск «птичьего гриппа», автоматически отображается ссылка на поиск по H5N1, что должно быть очень распространено в итоговых документах, но не во всем корпусе.

Вывод

В значительных терминах Elasticsearch снова добавила функцию, которая вполне может предложить неожиданные новые приложения и варианты использования для поиска. Это важно не только для аналитики, но и для улучшения классических поисковых приложений. Марк Харвуд собрал несколько действительно интересных примеров использования в блоге Elasticsearch . Если вы хотите прочитать еще один пост на эту тему, вы можете увидеть этот пост в блоге QBox, в котором представлены важные термины, а также агрегирование процентилей и кардинальности.

Ссылка: Что особенного в этом? Основные термины в Elasticseach от нашего партнера JCG Флориана Хопфа в блоге Dev Time .