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

时间:2012-12-02 18:42:27

标签: 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 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");
}

基本上即时创建一个新的FS目录,索引100个文档,每个文档有10个带有随机值的数字字段,名称相同(lucene docs说这是允许的吗?) 然后我尝试用范围查询搜索这个新创建的索引。

我希望每次都能获得近100次点击,但每次都会出现0次。

我显然做错了什么,但我不知道是什么。任何线索/想法都会非常受欢迎。

即时通讯使用java 7和lucene 3.6.1。这段代码需要lucene核心和lucene分析器工件来编译

1 个答案:

答案 0 :(得分:2)

NumericField:“要对NumericField执行范围查询或过滤,请使用NumericRangeQuery或NumericRangeFilter。”查询解析器不知道这是一个数字字段的先验,因此它的输出是基于字符串的:

<TermRangeQuery: numericField:[0 TO 0.5]>

而不是:

<NumericRangeQuery: numericField:[0.0 TO 0.5]>

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