1) Я пытаюсь выполнить свертку в полях массива, но при использовании агрегирования терминов в этом поле я получаю неверные данные в результате запроса свертки. 2) Мой шаблон индекса выглядит так:
{
"subjects" : {
"aliases" : { },
"mappings" : {
"doc" : {
"properties" : {
"event_at" : {
"type" : "date"
},
"long_score" : {
"type" : "long"
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"string_score" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
3) И документы:
{
"_index" : "subjects",
"_type" : "doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"name" : "cpp",
"string_score" : [
"300"
],
"long_score" : [
300
],
"event_at" : "2020-01-01T01:00:00.000Z"
}
},
{
"_index" : "subjects",
"_type" : "doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "c",
"string_score" : [
"100",
"200"
],
"long_score" : [
100,
200
],
"event_at" : "2020-01-01T01:00:00.000Z"
}
},
{
"_index" : "subjects",
"_type" : "doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"name" : "java",
"string_score" : [ ],
"long_score" : [ ],
"event_at" : "2020-01-01T01:00:00.000Z"
}
},
{
"_index" : "subjects",
"_type" : "doc",
"_id" : "4",
"_score" : 1.0,
"_source" : {
"name" : "php",
"string_score" : [
"400",
"500"
],
"long_score" : [
400,
500
],
"event_at" : "2020-01-01T01:00:00.000Z"
}
},
{
"_index" : "subjects",
"_type" : "doc",
"_id" : "5",
"_score" : 1.0,
"_source" : {
"name" : "c",
"string_score" : [
"100",
"200"
],
"long_score" : [
100,
200
],
"event_at" : "2020-01-01T01:00:00.000Z"
}
},
{
"_index" : "subjects",
"_type" : "doc",
"_id" : "6",
"_score" : 1.0,
"_source" : {
"name" : "c",
"string_score" : [
"100",
"200"
],
"long_score" : [
100,
200
],
"event_at" : "2020-01-01T01:00:00.000Z"
}
},
{
"_index" : "subjects",
"_type" : "doc",
"_id" : "7",
"_score" : 1.0,
"_source" : {
"name" : "php",
"string_score" : [
"400",
"500"
],
"long_score" : [
400,
500
],
"event_at" : "2020-01-01T01:00:00.000Z"
}
}
4) И запрос, на котором я работал нормальный индекс:
GET subjects/_search
{
"aggs": {
"name": {
"terms": {
"field": "name.keyword",
"size": 10
}
},
"string_score":{
"terms": {
"field": "string_score.keyword",
"size": 10
}
},
"long_score":{
"terms": {
"field": "long_score",
"size": 10
}
},
"sum_of_long_score":{
"sum": {
"field": "long_score"
}
}
}
}
5) результат вышеуказанного запроса:
"aggregations" : {
"sum_of_long_score" : {
"value" : 3000.0
},
"string_score" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "100",
"doc_count" : 3
},
{
"key" : "200",
"doc_count" : 3
},
{
"key" : "400",
"doc_count" : 2
},
{
"key" : "500",
"doc_count" : 2
},
{
"key" : "300",
"doc_count" : 1
}
]
},
"long_score" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : 100,
"doc_count" : 3
},
{
"key" : 200,
"doc_count" : 3
},
{
"key" : 400,
"doc_count" : 2
},
{
"key" : 500,
"doc_count" : 2
},
{
"key" : 300,
"doc_count" : 1
}
]
},
"name" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "c",
"doc_count" : 3
},
{
"key" : "php",
"doc_count" : 2
},
{
"key" : "cpp",
"doc_count" : 1
},
{
"key" : "java",
"doc_count" : 1
}
]
}
}
6) конфигурация накопительного задания:
PUT _xpack/rollup/job/subjects
{
"index_pattern": "subjects*",
"rollup_index": "ri_subjects",
"cron": "0 0/1 * * * ?",
"page_size": 1000,
"groups": {
"date_histogram": {
"field": "event_at",
"interval": "1d"
},
"terms": {
"fields": [
"string_score.keyword",
"long_score",
"name.keyword"
]
}
},
"metrics": [
{
"field": "long_score",
"metrics": [
"sum"
]
}
]
}
7) накопительный запрос, который я использовал:
GET ri_subjects/_rollup_search?size=0
{
"aggs":{
"name":{
"terms": {
"field": "name.keyword",
"size": 10
}
},
"string_score":{
"terms": {
"field": "string_score.keyword",
"size": 10
}
},
"long_score":{
"terms": {
"field": "long_score",
"size": 10
}
},
"long_sum":{
"sum": {
"field": "long_score"
}
}
}
}
8) результат накопительного запроса =
"aggregations" : {
"string_score" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "100",
"doc_count" : 6
},
{
"key" : "200",
"doc_count" : 6
},
{
"key" : "400",
"doc_count" : 4
},
{
"key" : "500",
"doc_count" : 4
},
{
"key" : "300",
"doc_count" : 1
}
]
},
"long_score" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : 100,
"doc_count" : 6
},
{
"key" : 200,
"doc_count" : 6
},
{
"key" : 400,
"doc_count" : 4
},
{
"key" : 500,
"doc_count" : 4
},
{
"key" : 300,
"doc_count" : 1
}
]
},
"name" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "c",
"doc_count" : 12
},
{
"key" : "php",
"doc_count" : 8
},
{
"key" : "cpp",
"doc_count" : 1
},
{
"key" : "java",
"doc_count" : 1
}
]
},
"long_sum" : {
"value" : 11100.0
}
}
9) Как мы видим, количество сегментов в результате как обычных, так и сводных запросов с ключами 100, 200, 400, 500 не совпадает. В обычном индексном запросе мы получили «key: doc_count» как 100: 3, 200: 3, 400: 2, 500: 2, а в запросе rollup_search мы получили 100: 6, 200: 6, 400: 4,500: 4.
10) так что мой вопрос, есть ли способ получить do c -count в терминах агг накопительного запроса так же, как обычный запрос для полей массива? или я здесь что-то не так делаю? любая помощь будет оценена. заранее спасибо!