Найти все документы Lucene, имеющие определенное поле - PullRequest
15 голосов
/ 14 сентября 2010

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

Есть ли способ?

Ответы [ 3 ]

5 голосов
/ 14 сентября 2010

Если вы знаете тип данных, хранящихся в вашем поле, вы можете попробовать запрос диапазона. Например, если ваше поле содержит строковые данные, запрос типа field:[a* TO z*] вернет все документы, в которых есть строковое значение в этом поле.

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

Я провел некоторые эксперименты, и, кажется, самый простой способ добиться этого - создать QueryParser и вызвать SetAllowLeadingWildcard( true ) и выполнить поиск field:* следующим образом:

var qp = new QueryParser( Lucene.Net.Util.Version.LUCENE_29, field, analyzer );
qp.SetAllowLeadingWildcard( true );
var query = qp.Parse( "*" ) );

(Обратите внимание, что я устанавливаю поле по умолчанию для QueryParser в field в его конструкторе, поэтому ищем просто "*" в Parse()).

Я не могу ручаться за то, насколько эффективен этот метод по сравнению с другими методами, но, будучи самым простым способом, который я могу найти, я ожидал бы, что он будет по крайней мере столь же эффективным, как field:[* TO *], и он избегает необходимости делать такие хакерские вещи, как field:[0* TO z*], что может не учитывать все возможные значения, например значения, начинающиеся с не алфавитно-цифровых символов.

2 голосов
/ 17 марта 2015

Другое решение - использование ConstantScoreQuery с FieldValueFilter

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