我有一个名为Tags
的表。在这个表格中,我有一个ID
,tag name
。 我想查找一个网页文本框中的某些prefix words
时用户输入的总记录数。 和stackoverflow.com一样。在Lucene或SQL SERVER中获取总记录数全文搜索
当用户键入"sql"
字,下面的结果:
我有一个名为Tags
的表。在这个表格中,我有一个ID
,tag name
。 我想查找一个网页文本框中的某些prefix words
时用户输入的总记录数。 和stackoverflow.com一样。在Lucene或SQL SERVER中获取总记录数全文搜索
当用户键入"sql"
字,下面的结果:
从Lucene索引,就可以得到使用IndexReader.docfreq所述的含有项(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();