NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Я не могу комментировать или отправлять сообщения напрямую, но можете ли вы дать дополнительные разъяснения?
Я попытался воссоздать проблему, поскольку ваш первый пример поиска должен работать так, как ожидалось. Чтобы подтвердить это, я создал простой индекс и добавил несколько записей для проверки различных предоставленных вами запросов:
POST demo/_doc
{
"created_at": "2019-04-02T12:00:00.000Z",
"comment": "contains comment"
}
POST demo/_doc
{
"created_at": "2019-04-03T12:00:00.000Z",
"comment": "contains another comment"
}
POST demo/_doc
{
"created_at": "2019-04-03T12:00:00.000Z",
"comment": "not what we are looking for"
}
Примечание. Я не беспокоился о пользовательском анализаторе, поскольку ваши отдельные запросы указывают отдельные поиски работают правильно, так что это не должно иметь никакого влияния.
После этого тестирование отдельных запросов дало ожидаемые результаты, а тестирование исходного запроса, который вы предоставили, также дало ожидаемые результаты:
Запрос:
GET demo/_search
{
"from": 0,
"size": 10,
"query": {
"bool": {
"must": [
{
"match": {
"comment": "comment"
}
},
{
"range": {
"created_at": {
"gte": "2019-04-03T00:00:00.000Z"
}
}
}
]
}
}
}
Результат:
{
"took" : 17,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.287682,
"hits" : [
{
"_index" : "demo",
"_type" : "_doc",
"_id" : "-sxo72kBwpqm-gdssSYh",
"_score" : 1.287682,
"_source" : {
"created_at" : "2019-04-03T12:00:00.000Z",
"comment" : "contains another comment"
}
}
]
}
}
Единственная возможность, которая выпадает на меня, это то, что вы указали в своем последнем утверждении, что есть посты, созданные «после 3 марта с текстом комментария в поле комментария», которые вы создали, но запросы фактически ищут посты с текстом комментария в поле для комментариев после апреля 3-го. Однако это вполне может быть опечаткой.
В качестве альтернативы, поскольку ваш второй запрос возвращает только 19 обращений (диапазон дат с просмотром поля created_at
), вы можете просмотреть их, найти поле с комментарием, содержащим текст comment
, и вставить его или фрагмент этого?