Найти все документы Lucene, имеющие определенное поле

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

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

Ответы

Ответ 1

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

Ответ 2

Я экспериментировал, и, кажется, самый простой способ добиться этого - создать 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*], который может не учитывать все возможные значения, такие как значения, начинающиеся с символов, отличных от алфавитно-цифровых символов.

Ответ 3

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

new ConstantScoreQuery(new FieldValueFilter("field"))