Elasticsearch null_pointer_exception с агрегацией top_hits - PullRequest
0 голосов
/ 21 января 2019

При наличии вложенной агрегации top_hits внутри агрегации вложенных терминов внутри дочерней агрегации я получаю исключение null_pointer_exception. Я ожидаю получить правильный ответ.

Шаги для воспроизведения:

создать отображение

PUT http://localhost:9200/test

{
    "mappings": {
        "doc": {
            "properties": {
                "docType": {
                    "type": "text"
                },
                "userId": {
                    "type": "long"
                },
                "userName": {
                    "type": "text"
                },
                "title": {
                    "type": "text"
                },
                "joinField": {
                    "type": "join",
                    "relations": {
                        "post": "comment"
                    }
                }
            }
        }
    }
}

вставить пример сообщения

PUT http://localhost:9200/test/doc/1
{
    "joinField": {
        "name": "post"
    },
    "docType": "post",
    "title": "Example Post"
}

вставить комментарий

PUT http://localhost:9200/test/doc/2?routing=1

{
    "joinField": {
        "name": "comment",
        "parent": "1"
    },
    "userId": 22,
    "userName": "John Doe",
    "title": "Random comment",
    "docType": "comment"
}

Выполнить поиск

POST http://localhost:9200/test/doc/_search

{
    "aggs": {
        "to-comment": {
            "children": {
                "type": "comment"
            },
            "aggs": {
                "by-user": {
                    "terms": {
                        "field": "userId"
                    },
                    "aggs": {
                        "data": {
                            "top_hits": {
                                "size": 1
                            }
                        }
                    }   
                }
            }
        }
    },
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "docType": "post"
                    }
                }
            ]
        }
    }
}

Ответ:

{
    "took": 10,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 4,
        "skipped": 0,
        "failed": 1,
        "failures": [
            {
                "shard": 3,
                "index": "test",
                "node": "0RbF1bIbRO-yN5C1m-HXPA",
                "reason": {
                    "type": "null_pointer_exception",
                    "reason": null
                }
            }
        ]
    },
    "hits": {
        "total": 0,
        "max_score": null,
        "hits": []
    },
    "aggregations": {
        "to-comment": {
            "doc_count": 0,
            "by-user": {
                "doc_count_error_upper_bound": 0,
                "sum_other_doc_count": 0,
                "buckets": []
            }
        }
    }
}

Это работает, если я удаляю запрос, но в реальных попаданиях я хочу получить только все сообщения. Это также работает, если я удаляю агрегаты терминов, но я хочу фильтровать посты по другим запросам (например, совпадать с заголовком).

1 Ответ

0 голосов
/ 21 января 2019

Похоже, это ошибка с упругим поиском. Об ошибке сообщается, и мы надеемся, что она скоро будет исправлена ​​(https://github.com/elastic/elasticsearch/issues/37650).

Если у вас есть какие-либо альтернативные решения о том, как построить аналогичное агрегирование, сообщите мне.

Изменить: Вы можете использовать безболезненный язык сценариев для обхода:

"script": {
  "lang": "painless",
  "source": "params._source.userName"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...