Lucene не нулевой запрос?

Как мы можем построить запрос для поиска определенного поля не равным null?

field_name:* не работает. Я пробовал field_name:[a* to z*], это отлично работает для английского, но не охватывает все языки.

Любые альтернативные предложения?

Ответ 1

В настоящее время Lucene не поддерживается. См. этот для обсуждения.

Альтернативным вариантом может быть сохранение некоторой предварительно определенной строки (например, nullnullnullnull) в качестве значения поля, если она равна нулю. Затем вы можете использовать отрицательный фильтр для удаления этих записей. (Мне это не очень нравится, но не могу придумать лучшего варианта)

Ответ 2

Я нашел, что это работает в некоторых случаях field:([0 TO 9] [a TO z])

Ответ 3

Попробуйте field:[* TO *] или field:["" TO *]. Но, вероятно, лучше использовать фильтр для этого.

Ответ 4

У меня была такая же проблема, но там есть свойство, которое вы можете задать в парсере запросов, который позволяет вам иметь подстановочные символы в начале поискового запроса.

queryParser.setAllowLeadingWildcard(true);

Это решило проблему для меня

См. Подстановочный знак в начале поискового запроса -Lucene

Ответ 5

Для тех, кто опаздывает на этот вопрос, документация включает этот небольшой фрагмент:

  • где title поля имеет любое ненулевое значение:
    _exists_:title

Ответ 6

Посмотрите на 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. Не уверен, что это правильный способ получить значение сейчас - пожалуйста, проверьте это

Ответ 7

В текущей версии 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 допускает несколько полей с тем же именем, что и в вышеупомянутом примере.

Ответ 8

Я только начал играть с lucene (через поиск эластичного лоскутаста) и обнаружил, что это, похоже, работает из пользовательского интерфейса kibana. Я еще не уверен, что если это какой-то интеллект в упругом поиске или кибане, я просто знаю, что эластичный поиск заимствован из синтаксиса lucene.

application:unit-test && !exception

вернет все результаты моих модульных тестов, у которых не было исключения

application:unit-test && exception

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

field

или

!field