【发布时间】:2022-04-07 01:59:26
【问题描述】:
我在 Java 11 中使用 Lucene 8.2.0。
我正在尝试索引 Long 值,以便我可以使用范围查询对其进行过滤,例如:+my_range_field:[1 TO 200]。然而,它的任何变体,即使是my_range_field:[* TO *],返回0 都会导致这个最小示例。一旦我从中删除+ 使其成为OR,我就会得到2 结果。
所以我想我在索引它的方式上一定犯了一个错误,但我无法弄清楚它可能是什么。
来自LongPointJavaDoc:
用于快速范围过滤器的索引长字段。如果您还需要存储该值,则应添加一个单独的 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) {
}
}
【问题讨论】:
标签: java indexing lucene java-11 range-query