1

我有一张名为Tags. 在这张表中,我有一个ID,一个tag nameprefix words当用户在网页文本框中输入一些内容时,我想按组查找总记录数。与 stackoverflow.com 相同。

当用户输入"sql"word 时,结果如下: 在此处输入图像描述

4

2 回答 2

1

从 Lucene 索引中,您可以使用IndexReader.docfreq获取包含术语 (docfreq) 的文档数,例如:

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

这将需要一个精确的术语值(没有通配符)。您应该正常执行通配符搜索,并如上所述为显示的每个结果调用 docfreq。

于 2013-05-15T04:49:49.893 回答
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();
于 2013-05-15T14:17:17.363 回答