【发布时间】:2013-05-15 00:48:49
【问题描述】:
我有一个名为Tags 的表。在这张表中,我有一个ID,一个tag name。
当用户在网页文本框中输入一些prefix words 时,我想按组查找总记录数。
与 stackoverflow.com 相同。
当用户输入"sql" word 时,结果如下:
【问题讨论】:
标签: sql-server lucene full-text-search lucene.net
我有一个名为Tags 的表。在这张表中,我有一个ID,一个tag name。
当用户在网页文本框中输入一些prefix words 时,我想按组查找总记录数。
与 stackoverflow.com 相同。
当用户输入"sql" word 时,结果如下:
【问题讨论】:
标签: sql-server lucene full-text-search lucene.net
从一个 Lucene 索引中,可以得到包含一个词条的文档的数量(docfreq),使用IndexReader.docfreq,如:
reader.docfreq("tags", new BytesRef("sql"));
这需要精确的术语值(无通配符)。您应该正常执行通配符搜索,并如上所述为显示的每个结果调用 docfreq。
【讨论】:
类似的东西会起作用。请注意,在大型索引上,前导通配符可能非常很慢。
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();
【讨论】: