2

我试图演示 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 文档说这是允许的?)然后我尝试使用范围查询搜索这个新创建的索引。

我希望每次都能获得近 100 次点击,但每次结果都是 0。

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

我正在使用 java 7 和 lucene 3.6.1。此代码需要 lucene 核心和 lucene 分析器工件来编译

4

1 回答 1

2

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

<TermRangeQuery: numericField:[0 TO 0.5]>

代替:

<NumericRangeQuery: numericField:[0.0 TO 0.5]>

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

于 2012-12-02T20:19:08.620 回答