Комплексные ключи для агрегатов ведра в Elasticsearch - PullRequest
0 голосов
/ 27 августа 2018

Можно ли вернуть более сложный ключ для совокупности сегментов в Elasticsearch? По умолчанию используется строка:

Запрос:

{
  "aggregations" : {
    "file.name" : {
      "terms" : {
        "field" : "file.name"
      },
      "aggregations" : {
        "level" : {
          "terms" : {
            "field" : "level"
          }
        }
      }
    }
  }
}

Результат:

{
    "aggregations": {
        "file.name": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [{
                "key": "test-1.pdf",
                "doc_count": 3,
                "level": {
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0,
                    "buckets": [{
                        "key": "Warning",
                        "doc_count": 2
                    }, {
                        "key": "Error",
                        "doc_count": 1
                    }]
                }
            }]
        }
    }
}

Здесь мои агрегаты сгруппированы по имени файла. Мне действительно нужно больше полей, чем просто имя. Например, я хотел бы видеть идентификатор для документа:

{
    "key": {
      "id": "1",
      "name": "test-1.pdf"
    },
    "doc_count": 3,
    "level": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [{
            "key": "Warning",
            "doc_count": 2
        }, {
            "key": "Error",
            "doc_count": 1
        }]
    }
}

Я не нашел ничего, что соответствовало бы этому требованию. Самым близким, что я нашел, является метрика скрипта, которая позволит мне разбить поля на строки:

Запрос:

{
  "aggregations" : {
    "file" : {
      "terms" : {
        "script" : {
          "inline" : "doc['file.id'].value ? doc['file.id'].value + '|' + doc['file.name'].value  : null"
        },
        "size" : 1000
      },
      "aggregations" : {
        "level" : {
          "terms" : {
            "field" : "level"
          }
        }
      }
    }
  }
}

Результат:

{
    "aggregations": {
        "file": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [{
                "key": "f-2|test-1.pdf",
                "doc_count": 3,
                "level": {
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0,
                    "buckets": [{
                        "key": "Warning",
                        "doc_count": 2
                    }, {
                        "key": "Error",
                        "doc_count": 1
                    }]
                }
            }]
        }
    }
} 

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

1 Ответ

0 голосов
/ 28 августа 2018

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

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

Запрос:

{
    "aggregations": {
        "file_id": {
            "terms": {
                "field": "file.id"
            },
            "aggregations": {
                "level": {
                    "terms": {
                        "field": "level"
                    }
                },
                "top_hits": {
                    "top_hits": {
                        "size": 1,
                        "fields": ["file.name", "file.path"]
                    }
                }
            }
        }
    }
}

Ответ:

{
    "aggregations": {
        "file_id": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [{
                "key": "f-2",
                "doc_count": 3,
                "level": {
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0,
                    "buckets": [{
                        "key": "Warning",
                        "doc_count": 2
                    }, {
                        "key": "Error",
                        "doc_count": 1
                    }]
                },
                "top_hits": {
                    "hits": {
                        "total": 3,
                        "max_score": 1.0,
                        "hits": [{
                            "_index": "logs-current",
                            "_type": "workspaceLog",
                            "_id": "log-5",
                            "_score": 1.0,
                            "fields": {
                                "file.name": ["test-1.pdf"]
                            }
                        }]
                    }
                }
            }]
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...