Как я могу получить статистические агрегации значимых терминов в Elasticsearch? - PullRequest
1 голос
/ 08 апреля 2020

В Elasticsearch в моем индексе есть поля со следующими определениями:

"my_id": {
    "type": "keyword"
},
"titles": {
    "type": "keyword",
     "fields": {
          "fulltext": {
              "type": "text"
          }
     }
}

Я храню несколько titles на документ (в основном массив строк).

Предположим, я проиндексировал документ со следующим:

  • my_id = "MH123"
  • title = ["Звездные войны: новая надежда", "Звездные войны: возвращение джедая", "Звездные войны: «Империя наносит ответный удар»]

Я хочу вернуть significant_terms агрегатов на основе каждого идентификатора документа, например ..

  • Где my_id = "MH123"
  • Важные термины: «Звездные войны»

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

Я попытался создать корзину внутри корзины, первая из которых была разделена по идентификатору, а внутренняя возвращала значимые термины. значимые_термы возвращают пустой массив.

{
    "aggs": {
        "titles": {
            "terms": {
                "field": "my_id"
            },
            "aggs": {
                "my_common_terms": {
                    "significant_terms": {
                        "field": "titles"
                    }
                }
            }
        }
    }
}

1 Ответ

1 голос
/ 08 апреля 2020

Значимые термины aggs делают противоположное тому, что вы ожидаете - они ищут необычные вхождения , а не самые распространенные термины!

Пример:

PUT stars
{"mappings":{"properties":{"my_id":{"type":"keyword"},"titles":{"type":"keyword","fields":{"fulltext":{"type":"text"}}}}}}

Затем индексируем несколько документов с похожими идентификаторами

POST stars/_doc
{
  "my_id": "MH123",
  "titles": [
    "Star Wars: A New Hope",
    "Star Wars: Return of the Jedi",
    "Star Wars: \"Empire Strikes Back\""
  ]
}

POST stars/_doc
{
  "my_id": "MH124",
  "titles": [
    "Star Wars: A New Hope",
    "Star Wars: Return of the Jedi",
    "Star Wars: \"Empire Strikes Back\""
  ]
}

Обратите внимание, что у следующего есть строка uncommon terms внутри titles

POST stars/_doc
{
  "my_id": "MH125",
  "titles": [
    "uncommon terms",
    "Star Wars: A New Hope",
    "Star Wars: Return of the Jedi",
    "Star Wars: \"Empire Strikes Back\""
  ]
}

Теперь, уменьшив min_doc_count от значения по умолчанию 3 до 1:

GET stars/_search
{
  "size": 0,
  "aggs": {
    "titles": {
      "terms": {
        "field": "my_id"
      },
      "aggs": {
        "my_common_terms": {
          "significant_terms": {
            "field": "titles",
            "min_doc_count": 1
          }
        }
      }
    }
  }
}

, уступающего

  "aggregations" : {
    "titles" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "MH123",
          "doc_count" : 1,
          "my_common_terms" : {
            "doc_count" : 1,
            "bg_count" : 3,
            "buckets" : [ ]
          }
        },
        {
          "key" : "MH124",
          "doc_count" : 1,
          "my_common_terms" : {
            "doc_count" : 1,
            "bg_count" : 3,
            "buckets" : [ ]
          }
        },
        {
          "key" : "MH125",
          "doc_count" : 1,
          "my_common_terms" : {
            "doc_count" : 1,
            "bg_count" : 3,
            "buckets" : [
              {
                "key" : "uncommon terms",
                "doc_count" : 1,
                "score" : 2.0,
                "bg_count" : 1
              }
            ]
          }
        }
      ]
    }
  }

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


То, что вы ищете, это фильтры с галькой, и вот вам хорошее начало в них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...