value_count повторяющихся значений в массиве вместо doc_count - PullRequest
1 голос
/ 07 апреля 2020

Если у вас есть массив с повторяющимися значениями, вы можете выполнить агрегацию terms, но она даст вам doc_count. Есть ли способ получить value_count для каждого из значений вместо doc_count?

Например, если у вас есть 2 строки со следующим: ["A", "A", "A", "B", "B", "C"] ["A", "C", "C", "D"]

Обобщение терминов даст:

"A": 2,
"B": 1,
"C": 2,
"D": 1,

Но есть ли способ получить следующее?

"A": 4,
"B": 3,
"C": 2,
"D": 1,

1 Ответ

0 голосов
/ 07 апреля 2020

Я могу думать о его реализации двумя способами.

  1. Создать вложенный тип и рассчитать количество терминов на стороне клиента

Отображение

PUT index82
{
  "mappings": {
    "properties": {
      "tags":{
        "type": "nested",
        "properties": {
          "name":{
            "type":"keyword"
          },
            "count":{
              "type":"integer"
            }
          }
        }
      }
    }
}

Данные:

"hits" : [
      {
        "_index" : "index82",
        "_type" : "_doc",
        "_id" : "Uky-UnEB8es6kpJsB_Ak",
        "_score" : 1.0,
        "_source" : {
          "tags" : [
            {
              "name" : "A",
              "count" : 4
            },
            {
              "name" : "B",
              "count" : 2
            },
            {
              "name" : "C",
              "count" : 1
            }
          ]
        }
      },
      {
        "_index" : "index82",
        "_type" : "_doc",
        "_id" : "U0y-UnEB8es6kpJsNfCB",
        "_score" : 1.0,
        "_source" : {
          "tags" : [
            {
              "name" : "A",
              "count" : 1
            },
            {
              "name" : "C",
              "count" : 2
            },
            {
              "name" : "D",
              "count" : 1
            }
          ]
        }
      }
    ]

Запрос:

{
  "aggs": {
    "tags": {
      "nested": {
        "path": "tags"
      },
      "aggs": {
        "tag": {
          "terms": {
            "field": "tags.name",
            "size": 10
          },
          "aggs": {
            "count": {
              "sum": {
                "field": "tags.count"
              }
            }
          }
        }
      }
    }
  }
}

Результат:

"aggregations" : {
    "tags" : {
      "doc_count" : 6,
      "tag" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 0,
        "buckets" : [
          {
            "key" : "A",
            "doc_count" : 2,
            "count" : {
              "value" : 5.0
            }
          },
          {
            "key" : "C",
            "doc_count" : 2,
            "count" : {
              "value" : 3.0
            }
          },
          {
            "key" : "B",
            "doc_count" : 1,
            "count" : {
              "value" : 2.0
            }
          },
          {
            "key" : "D",
            "doc_count" : 1,
            "count" : {
              "value" : 1.0
            }
          }
        ]
      }
    }
  }
Использовать term_vectors

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

POST index81/_mtermvectors
{
    "docs": [
      {
         "_id": "TUy3UnEB8es6kpJsfPC4", ---> id of documents
         "term_statistics": true,
         "fields": [
            "tags"
         ]
      },
      {
         "_id": "Tky3UnEB8es6kpJshfAn",
         "term_statistics": true,
         "fields": [
            "tags"
         ]
      }
    ]
}

Результат:

  "docs" : [
    {
      "_index" : "index81",
      "_type" : "_doc",
      "_id" : "TUy3UnEB8es6kpJsfPC4",
      "_version" : 1,
      "found" : true,
      "took" : 5,
      "term_vectors" : {
        "tags" : {
          "field_statistics" : {
            "sum_doc_freq" : 6,
            "doc_count" : 2,
            "sum_ttf" : 10
          },
          "terms" : {
            "a" : {
              "doc_freq" : 2,
              "ttf" : 4,
              "term_freq" : 3,
              "tokens" : [
                {
                  "position" : 0,
                  "start_offset" : 0,
                  "end_offset" : 1
                },
                {
                  "position" : 101,
                  "start_offset" : 2,
                  "end_offset" : 3
                },
                {
                  "position" : 202,
                  "start_offset" : 4,
                  "end_offset" : 5
                }
              ]
            },
            "b" : {
              "doc_freq" : 1,
              "ttf" : 2,
              "term_freq" : 2,
              "tokens" : [
                {
                  "position" : 303,
                  "start_offset" : 6,
                  "end_offset" : 7
                },
                {
                  "position" : 404,
                  "start_offset" : 8,
                  "end_offset" : 9
                }
              ]
            },
            "c" : {
              "doc_freq" : 2,
              "ttf" : 3,
              "term_freq" : 1,
              "tokens" : [
                {
                  "position" : 505,
                  "start_offset" : 10,
                  "end_offset" : 11
                }
              ]
            }
          }
        }
      }
    },
    {
      "_index" : "index81",
      "_type" : "_doc",
      "_id" : "Tky3UnEB8es6kpJshfAn",
      "_version" : 1,
      "found" : true,
      "took" : 2,
      "term_vectors" : {
        "tags" : {
          "field_statistics" : {
            "sum_doc_freq" : 6,
            "doc_count" : 2,
            "sum_ttf" : 10
          },
          "terms" : {
            "a" : {
              "doc_freq" : 2,
              "ttf" : 4,
              "term_freq" : 1,
              "tokens" : [
                {
                  "position" : 0,
                  "start_offset" : 0,
                  "end_offset" : 1
                }
              ]
            },
            "c" : {
              "doc_freq" : 2,
              "ttf" : 3,
              "term_freq" : 2,
              "tokens" : [
                {
                  "position" : 101,
                  "start_offset" : 2,
                  "end_offset" : 3
                },
                {
                  "position" : 202,
                  "start_offset" : 4,
                  "end_offset" : 5
                }
              ]
            },
            "d" : {
              "doc_freq" : 1,
              "ttf" : 1,
              "term_freq" : 1,
              "tokens" : [
                {
                  "position" : 303,
                  "start_offset" : 6,
                  "end_offset" : 7
                }
              ]
            }
          }
        }
      }
    }
  ]
...