Как мы можем построить запрос для поиска определенного поля не равным null?
field_name:*
не работает.
Я пробовал field_name:[a* to z*]
, это отлично работает для английского, но не охватывает все языки.
Любые альтернативные предложения?
Как мы можем построить запрос для поиска определенного поля не равным null?
field_name:*
не работает.
Я пробовал field_name:[a* to z*]
, это отлично работает для английского, но не охватывает все языки.
Любые альтернативные предложения?
В настоящее время Lucene не поддерживается. См. этот для обсуждения.
Альтернативным вариантом может быть сохранение некоторой предварительно определенной строки (например, nullnullnullnull
) в качестве значения поля, если она равна нулю. Затем вы можете использовать отрицательный фильтр для удаления этих записей. (Мне это не очень нравится, но не могу придумать лучшего варианта)
Я нашел, что это работает в некоторых случаях field:([0 TO 9] [a TO z])
Попробуйте field:[* TO *]
или field:["" TO *]
. Но, вероятно, лучше использовать фильтр для этого.
У меня была такая же проблема, но там есть свойство, которое вы можете задать в парсере запросов, который позволяет вам иметь подстановочные символы в начале поискового запроса.
queryParser.setAllowLeadingWildcard(true);
Это решило проблему для меня
Для тех, кто опаздывает на этот вопрос, документация включает этот небольшой фрагмент:
title
поля имеет любое ненулевое значение: _exists_:title
Посмотрите на org.apache.lucene.search.FieldValueQuery:
A Query that matches documents that have a value for a given field as reported by LeafReader#getDocsWithField(String).
обратите внимание, что он работает только с DocValues, поэтому вам нужно изменить способ создания документа:
document.add(new StringField("field-name", "field-value", Field.Store.YES));
document.add(new SortedDocValuesField("field-name", new BytesRef("field-value")));
здесь я добавил два поля - вам все еще нужен обычный StringField для получения значения. Вы можете использовать BinaryDocValues # get() для более старых версий Lucene, но, как я вижу, он удален в v7. Не уверен, что это правильный способ получить значение сейчас - пожалуйста, проверьте это
В текущей версии Lucene FieldValueQuery устарел. В настоящее время вы можете использовать:
new DocValuesFieldExistsQuery(name)
Это работает только для SortedDocValuesFields, поэтому вы должны добавить их при создании документа.
doc.add(new SortedDocValuesField(name, new BytesRef(value));
doc.add(new StringField(name, value, Field.Store.Yes)); //optional
Вторая строка позволяет вам получить значение (значения DocValuesFields не могут быть прочитаны как строки).
Обратите внимание, что lucene допускает несколько полей с тем же именем, что и в вышеупомянутом примере.
Я только начал играть с lucene (через поиск эластичного лоскутаста) и обнаружил, что это, похоже, работает из пользовательского интерфейса kibana. Я еще не уверен, что если это какой-то интеллект в упругом поиске или кибане, я просто знаю, что эластичный поиск заимствован из синтаксиса lucene.
application:unit-test && !exception
вернет все результаты моих модульных тестов, у которых не было исключения
application:unit-test && exception
возвращает те, у которых индексируется ненулевое исключение. поэтому вы можете попробовать просто
field
или
!field