2011-10-23 141 views
5

好吧,我在过去两个小时内搜索了这个结果,只给出了提示, ,甚至没有一个完整的代码来救援(如果noobs不能看到一些?样品)Lucene - 搜索数值字段

我创建了一个索引,如下所示:

Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo(Server.MapPath("/data/channels/"))); 
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29); 
IndexWriter writer = new IndexWriter(directory, analyzer, true, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED); 
Document doc = new Document(); 
doc.Add(new Field("ID", "0", Field.Store.YES, Field.Index.NO)); 
doc.Add(new Field("parentID", "0", Field.Store.YES, Field.Index.NO)); 
doc.Add(new Field("Title", "Root", Field.Store.YES, Field.Index.ANALYZED)); 
writer.AddDocument(doc); 
writer.Optimize(); 
writer.Close(); 

现在,我要搜索领域ID中值等于0(获取单个记录我有没有)...... 。

但是,像这样的简单搜索:

Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo(Server.MapPath("/data/channels"))); 
Analyzer analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer(Version.LUCENE_29); 
Searcher searcher = new Lucene.Net.Search.IndexSearcher(IndexReader.Open(directory, true)); 
Query query = new Lucene.Net.QueryParsers.QueryParser(Version.LUCENE_29, "ID", analyzer).Parse("0"); 
Hits hits = searcher.Search(query); 

返回无结果。 我已阅读约NumericRange,KeywordAnalyzer和一些更多的东西, 但因为他们都没有提供一个样本,我无法弄清楚如何做到这一点。

拜托,善良的人,给我一个如何使这件事情工作的例子。

回答

7

变化Field.Index.NO在ID字段Field.Index.ANALYZED(或Field.Index.NOT_ANALYZED

9

我已经使用NumericField和NumericRangeQuery搜索Lucene的索引号。

在创建索引:

NumericField taxonRankSortOrder = new NumericField("TaxonRankSortOrder", Field.Store.YES, true); 
    taxonRankSortOrder.SetIntValue(rank); 
    document.Add(taxonRankSortOrder); 

,然后用一个查询:

NumericRangeQuery query = NumericRangeQuery.NewIntRange("TaxonRankSortOrder", 3000, 3000, true, true); 

将返回所有的文件与等于3000

一个TaxonRankSortOrder你必须创建查询你自己而不是使用QueryParser,所以会热衷于看看是否还有更好的方法。

+4

如果你只是搜索一个int,你不需要按范围搜索。简单地使用这个: TermQuery query = new TermQuery(new Term(“TaxonRankSortOrder”,NumericUtils.IntToPrefixCoded(3000))); –