Lucene 3.0.3数字术语查询

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

谢谢!

数字字段不会作为纯文本术语编制索引,因此将字符串表示forms作为术语进行搜索将不起作用。

喜欢与否,构建一个NumericRangeQuery ,其中min = max确实是正确的方法:

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

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

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

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

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

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

我发现它来自: http : //www.gossamer-threads.com/lists/lucene/java-user/88516并且它可以正常工作