Lucene не нулевой запрос? - PullRequest
14 голосов
/ 22 марта 2011

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

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

Есть альтернативные предложения?

Ответы [ 8 ]

14 голосов
/ 28 октября 2011

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

4 голосов
/ 22 марта 2011

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

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

3 голосов
/ 19 декабря 2018

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

  • , где поле title имеет любое ненулевое значение:
    _exists_:title
3 голосов
/ 24 октября 2011

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

queryParser.setAllowLeadingWildcard(true);

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

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

3 голосов
/ 22 марта 2011

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

0 голосов
/ 20 июня 2019

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

0 голосов
/ 02 августа 2018

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

0 голосов
/ 18 июня 2014

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

application:unit-test && !exception

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

application:unit-test && exception

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

field

или

!field
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...