即时尝试演示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 docs说这是允许的吗?) 然后我尝试用范围查询搜索这个新创建的索引。
我希望每次都能获得近100次点击,但每次都会出现0次。
我显然做错了什么,但我不知道是什么。任何线索/想法都会非常受欢迎。即时通讯使用java 7和lucene 3.6.1。这段代码需要lucene核心和lucene分析器工件来编译
答案 0 :(得分:2)
从NumericField:“要对NumericField执行范围查询或过滤,请使用NumericRangeQuery或NumericRangeFilter。”查询解析器不知道这是一个数字字段的先验,因此它的输出是基于字符串的:
<TermRangeQuery: numericField:[0 TO 0.5]>
而不是:
<NumericRangeQuery: numericField:[0.0 TO 0.5]>
通常建议尽可能以编程方式构造查询,以避免解析此类问题。