2013-05-15 80 views

回答

0

從Lucene索引,就可以得到使用IndexReader.docfreq所述的含有項(docfreq)文件數,如:

reader.docfreq("tags", new BytesRef("sql")); 

這將需要一個精確的期限值(沒有通配符)。你應該正常地執行你的通配符搜索,並且如上所述對每個顯示的結果調用docfreq。

1

類似的東西可以工作。請注意,一個領先的通配符可以是非常大在大型索引上變慢。

RAMDirectory dir = new RAMDirectory(); 
IndexWriter iw = new IndexWriter(dir, new KeywordAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED); 

Document d = new Document(); 
Field f = new Field("tag", "", Field.Store.YES, Field.Index.ANALYZED); 
d.Add(f); 

f.SetValue("sql"); 
iw.AddDocument(d); 
f.SetValue("mysql"); 
iw.AddDocument(d); 
f.SetValue("sql-server"); 
iw.AddDocument(d); 
f.SetValue("sql-server"); 
iw.AddDocument(d); 
f.SetValue("sql-server"); 
iw.AddDocument(d); 
f.SetValue("c#"); 
iw.AddDocument(d); 
f.SetValue("java"); 
iw.AddDocument(d); 
f.SetValue("java"); 
iw.AddDocument(d); 

iw.Commit(); 
IndexReader reader = iw.GetReader(); 
Console.WriteLine("Tags containing sql"); 
using (FilteredTermEnum termEnum = new WildcardTermEnum(reader, new Term("tag", "*sql*"))) 
{ 
    do 
    { 
     if (termEnum.Term != null) 
      Console.WriteLine(termEnum.Term.Text + ":" + reader.DocFreq(termEnum.Term)); 
    } 
    while (termEnum.Next()); 
} 
Console.WriteLine("\nTags containing java"); 
using (FilteredTermEnum termEnum = new WildcardTermEnum(reader, new Term("tag", "*java*"))) 
{ 
    do 
    { 
     if (termEnum.Term != null) 
      Console.WriteLine(termEnum.Term.Text + ":" + reader.DocFreq(termEnum.Term)); 
    } 
    while (termEnum.Next()); 
} 
reader.Dispose(); 
iw.Dispose();