Java 如何在lucene中为具有多个值的数字字段正确创建范围查询

Java 如何在lucene中为具有多个值的数字字段正确创建范围查询,java,lucene,Java,Lucene,我试图演示lucene数值范围查询,但无法使其正常工作。 以下是我想做的: public static void main( String[] args ) throws Exception{ Path indexDir = Files.createTempDirectory("index"); Directory directory = FSDirectory.open(indexDir.toFile()); Analyzer analyzer = new Englis

我试图演示lucene数值范围查询,但无法使其正常工作。 以下是我想做的:

public static void main( String[] args ) throws Exception{
    Path indexDir = Files.createTempDirectory("index");
    Directory directory = FSDirectory.open(indexDir.toFile());
    Analyzer analyzer = new EnglishAnalyzer(Version.LUCENE_36);
    IndexWriterConfig writerConfig = new IndexWriterConfig(Version.LUCENE_36, analyzer);
    writerConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
    IndexWriter writer = new IndexWriter(directory, writerConfig);
    for (int i=0; i<100; i++) {
        Document doc = new Document();
        for (int j = 0; j<10; j++) {
            NumericField field = new NumericField("numericField", Field.Store.YES, true);
            field.setDoubleValue(Math.random());
            doc.add(field);
        }
        writer.addDocument(doc);
    }
    writer.close(true);
    directory.close(); //just to be safe

    analyzer = new EnglishAnalyzer(Version.LUCENE_36);
    directory = FSDirectory.open(indexDir.toFile());
    IndexReader reader = IndexReader.open(directory);
    IndexSearcher searcher = new IndexSearcher(reader);
    QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_36, new String[] {"someField", "someOtherField"}, analyzer);
    Query q = parser.parse("numericField:[0 TO 0.5]");
    TopDocs results = searcher.search(q, 100);
    System.out.println("got "+results.scoreDocs.length+" results");
}
publicstaticvoidmain(字符串[]args)引发异常{
路径indexDir=Files.createTempDirectory(“索引”);
Directory=FSDirectory.open(indexDir.toFile());
Analyzer Analyzer=新的英语Analyzer(版本.LUCENE_36);
IndexWriterConfig writerConfig=新的IndexWriterConfig(Version.LUCENE_36,analyzer);
writerConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
IndexWriter writer=新的IndexWriter(目录,writerConfig);
对于(int i=0;iFrom):“要对数值字段执行范围查询或筛选,请使用NumericRangeQuery或NumericRangeFilter。”查询解析器事先不知道这是数值字段,因此其输出基于字符串:

<TermRangeQuery: numericField:[0 TO 0.5]>

而不是:

<NumericRangeQuery: numericField:[0.0 TO 0.5]>


通常建议尽可能以编程方式构造查询,以避免像这样的解析问题。

谢谢。以编程方式生成查询并不是一个真正的选项,但我发现我可以扩展QueryParser并覆盖getRangeQuery()以返回特定字段的数值范围(否则委托给super)