2013-05-15 50 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();