我有一个名为Tags
的表。在此表格中,我有一个ID
,一个tag name
。
我希望按用户在网页文本框中输入某些prefix words
时按组查找总记录数。
与stackoverflow.com相同。
当用户输入"sql"
字时,结果如下:
答案 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,如上所述。