Я могу думать о его реализации двумя способами.
- Создать вложенный тип и рассчитать количество терминов на стороне клиента
Отображение
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
}
]
}
}
}
}
}
]