Агрегирование Elasticsearch на вложенном (не массиве) поле - PullRequest
0 голосов
/ 25 апреля 2018

Что-то мне не совсем понятно в отношении агрегатов во вложенных полях, которые не являются массивами, а являются простыми объектами.

Давайте рассмотрим простой сценарий, в котором у меня есть вложенные поля с языками + normalized_name (который действует каккакой-то идентификатор)

# index/_mapping
"tags": {
    "type": "nested",
    "properties": {
        "english": {
            "type": "text",
            "analyzer": "english"
        },
        "french": {
            "type": "text",
            "analyzer": "french_light"
        },
        "normalized": {
            "type": "keyword"
        }
    }
},

Учитывая поисковый запрос Q, я хочу агрегировать количество документов, теги которых, по-английски ИЛИ по-французски ИЛИ нормализовано, точно соответствуют моему термину (документ должен учитываться только один раз, еслион соответствует нескольким вложенным полям fr / en / normalized, но это на самом деле не имеет значения, так как английский / французский / нормализованный все различаются с учетом регистра (однако, возможно, не учитывает регистр) и используют их tags.normalized в качестве ключа для моей агрегацииЯ считаю, что фильтрация выполнена правильно, но я все еще не получаю никаких данных ...

Раньше, когда у меня было одно значение, я делал

aggs: {tags: {terms: {field: "tag", size: 1000}}}}} 

Когда япрочитайте документацию, я вижу много ссылок на вложенные агрегаты, но все они, похоже, относятся к вложенным агрегатам внутри aggregaно я просто хочу объединить количество документов на основе вложенного поля.Я пробовал что-то вроде

aggs: {tag_names: {terms: {field: "tags.normalized", size: 100}}

... но, похоже, не работает.Нужно ли использовать синтаксис nested?Я не хочу получать результаты с вложенными агрегациями, просто для агрегирования на вложенном поле ...

1 Ответ

0 голосов
/ 25 апреля 2018

Ах, мой плохой, после еще нескольких попыток и более четкого чтения документа я понял, что тип nested для Elasticsearch был всего лишь «вложенным массивом», а не «вложенным объектом».

Длявложенные объекты, которые мне просто нужно было использовать type: :object в моем отображении ... после этого все работает хорошо с aggs: {tag_names: {terms: {field: "tags.normalized", size: 100}}

...