Я использую Lucene 8.2.0 в Java 11.
Я пытаюсь проиндексировать значение Long
, чтобы я мог фильтровать его с помощью запроса диапазона, например, так: +my_range_field:[1 TO 200]
. Однако любой вариант этого, даже my_range_field:[* TO *]
, возвращает 0
результатов в этом минимальном примере. Как только я удаляю из него +
, чтобы сделать его OR
, я получаю результаты 2
.
Поэтому я думаю, что должен ошибиться в том, как я его индексирую, но я не могу понять, что это может быть.
Из LongPoint
JavaDoc:
Индексированное длинное поле для фильтров быстрого диапазона. Если вам также необходимо сохранить значение, вы должны добавить отдельный экземпляр StoredField. Поиск всех документов в N-мерной форме или диапазоне во время поиска эффективен. Допускается использование нескольких значений для одного и того же поля в одном документе.
Это мой минимальный пример:
public static void main(String[] args) {
Directory index = new RAMDirectory();
StandardAnalyzer analyzer = new StandardAnalyzer();
try {
IndexWriter indexWriter = new IndexWriter(index, new IndexWriterConfig(analyzer));
Document document1= new Document();
Document document2= new Document();
document1.add(new LongPoint("my_range_field", 10));
document1.add(new StoredField("my_range_field", 10));
document2.add(new LongPoint("my_range_field", 100));
document2.add(new StoredField("my_range_field", 100));
document1.add(new TextField("my_text_field", "test content 1", Field.Store.YES));
document2.add(new TextField("my_text_field", "test content 2", Field.Store.YES));
indexWriter.deleteAll();
indexWriter.commit();
indexWriter.addDocument(document1);
indexWriter.addDocument(document2);
indexWriter.commit();
indexWriter.close();
QueryParser parser = new QueryParser("text", analyzer);
IndexSearcher indexSearcher = new IndexSearcher(DirectoryReader.open(index));
String luceneQuery = "+my_text_field:test* +my_range_field:[1 TO 200]";
Query query = parser.parse(luceneQuery);
System.out.println(indexSearcher.search(query, 10).totalHits.value);
} catch (IOException e) {
} catch (ParseException e) {
}
}