Найти все документы 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"))