获取Lucene或SQL SERVER全文搜索中的总记录数

时间:2013-05-15 00:48:50

标签: sql-server lucene full-text-search lucene.net

我有一个名为Tags的表。在此表格中,我有一个ID,一个tag name。 我希望按用户在网页文本框中输入某些prefix words时按组查找总记录数。 与stackoverflow.com相同。

当用户输入"sql"字时,结果如下: enter image description here

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

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

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

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