Java Lucene 3.0.3数字术语查询

Java Lucene 3.0.3数字术语查询,java,lucene,Java,Lucene,我在Lucene 3.0.3中有一个数字字段,它可以很好地处理范围查询。如果我们切换到术语查询,它不会产生任何结果。例如: Document doc = new Document(); String name = "geolongitude"; NumericField numericField = new NumericField(name); double value = 29.0753505; String valueAsString = "29.0

我在Lucene 3.0.3中有一个数字字段,它可以很好地处理范围查询。如果我们切换到术语查询,它不会产生任何结果。例如:

    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”,但找不到。我可以做一些棘手的事情(对我正在搜索的术语进行范围查询),但我不喜欢这个解决方案


谢谢大家!

数字字段没有作为纯文本术语编制索引,因此搜索它们作为术语的字符串表示形式将不起作用

不管你喜欢与否,构造一个
numeriRangeQuery
,其中min=max确实是正确的方法:

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

NumericRangeQuery的实现实际上明确地识别了这种情况,并设计用于很好地处理它。

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


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

好的,我找到了一个不同的解决方案

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

我从中找到了答案:它工作正常

好吧,我找到了另一个答案,它正在工作。显然,这不是唯一可能的查询。但无论如何,谢谢你是的,这可以奏效,但我发现直接使用
NumericUtils
不是最好的主意。问题是,正如API中指出的:“注意:此API仅用于内部目的,在下一版本中可能会以不兼容的方式更改。”。它可以在不同版本之间进行显著的、不兼容的更改,并且已经发生了(特别是在4.0中)。它还要求您担心可能与精度相关的错误,因为您必须生成完全相同的术语,而不是让
numerichangequery
的精度处理接管该问题。