我在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”,但无法找到。我可以做一些棘手的事情(对我正在搜索的术语进行范围查询)但我不喜欢这个解决方案。
谢谢!
答案 0 :(得分:6)
数字字段未编入纯文本字词索引,因此将字符串表示形式作为术语进行搜索将无效。
不管你喜不喜欢,构建一个NumericRangeQuery
,其中min = max确实是正确的方法:
Query query = NumericRangeQuery.newDoubleRange(name, value, value, true, true);
NumericRangeQuery
的实现具体地,实际上,并且旨在很好地处理它。
答案 1 :(得分:0)
使用NumericField构建索引时,索引中的值为29.0753505(双精度数据)。 TermQuery将使用值“29.0753505”(字符串)进行搜索。
我认为如果你不喜欢使用范围查询,你可以自己暗示一个数字查询,你可以在NumericRangeTermEnum
中看到NumericRangeQuery
的代码,并暗示一个termEnum包含完全匹配的所有术语。
答案 2 :(得分:-1)
好的,我找到了一个不同的解决方案,
String doubleToPrefixCoded = NumericUtils.doubleToPrefixCoded(value);
Query termQ = new TermQuery(new Term(name, doubleToPrefixCoded));
我是从http://www.gossamer-threads.com/lists/lucene/java-user/88516找到的,它可以正常使用