2

我在 Lucene 3.0.3 中有一个数字字段,它与范围查询完美配合。如果我们切换到 TermQuery,它不会产生任何结果。例如:

    Document doc = new Document();
    String name = "geolongitude";
    NumericField numericField = new NumericField(name);
    double value = 29.0753505;
    String valueAsString = "29.0753505";
    numericField.setDoubleValue(value);
    doc.add(numericField);
    indexWriter.addDocument(doc);
    indexWriter.commit();
    indexWriter.close();
    IndexSearcher indexSearcher = new IndexSearcher(open);
    Query termQ = new TermQuery(new Term(name, valueAsString));
    TopDocs search = indexSearcher.search(termQ, 10);

在这种情况下,我没有得到任何结果。我试图弄清楚是否存在任何“NumericTermQuery”,但找不到。我可以做一些棘手的事情(对我正在搜索的术语进行范围查询),但我不喜欢这个解决方案。

谢谢!

4

3 回答 3

6

数字字段不会作为纯文本术语进行索引,因此无法将其字符串表示形式作为术语进行搜索。

不管你喜不喜欢,构造一个NumericRangeQuerywhere min = max 确实是正确的方法:

Query query = NumericRangeQuery.newDoubleRange(name, value, value, true, true);

的实现NumericRangeQuery实际上是专门识别这种情况的,并且旨在很好地处理它。

于 2013-10-16T18:35:15.647 回答
0

使用 NumericField 构建索引时,索引中的值为 29.0753505(双精度数据)。TermQuery 将使用值“29.0753505”(字符串)进行搜索。

我想如果你不喜欢使用范围查询,你可以自己暗示一个数字查询,你可以看到NumericRangeTermEnumin的代码NumericRangeQuery,并暗示一个使 termEnum 包含所有完全匹配的术语。

于 2013-10-17T09:26:03.633 回答
-1

好的,我想出了一个不同的解决方案,

String doubleToPrefixCoded = NumericUtils.doubleToPrefixCoded(value);
Query termQ = new TermQuery(new Term(name, doubleToPrefixCoded));

我从:http ://www.gossamer-threads.com/lists/lucene/java-user/88516 找到它,它工作正常

于 2013-10-17T09:43:53.933 回答