您的位置:首页 > 其它

Lucene.Net 初步接触 (一)

2011-03-14 02:44 218 查看
最近在学习lucene.net ,发现这个东西 入门还不算难,不过自己写词法分析器应该就比较难了。

先在就晒晒我写的第一个简单的程序。

]      protected void BtnMyCreatIndex_OnClick(object sender, EventArgs e)
{
#region DEMO
indexDirectory = Server.MapPath("Index2");//指定生成索引的生成位置
//生成 索引写 对象  IndexWriter负责将 记录(数据 doc)写加入索引
//数据首先要经过词法分析器analyzer 分析器进行 分词工作,将分词结果交给 IndexWriter.
//在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。
//Analyzer 类是一个抽象类,它有多个实现。
//针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。
IndexWriter indexWriter = new IndexWriter(indexDirectory, analyzer, !IndexReader.IndexExists((indexDirectory)));//第三个参数是来说明是否增量索引,,具体还没研究

//构造一条记录doc,类似与数据库中的一行,一条记录
//document 就像是数据库中的一条记录 Row。这条记录中应该有固定的列,就是Field,该字段有一个名字(就像数据库的列名),即第一个参数,
//第二个参数 表示该 条记录 的该 字段的值
//其他参数是对建索引或分词的配置??
//Field field=new Field(name,value_Renamed:, );
Document doc = new Document();
doc.Add(new Field("名字", "王小明", Field.Store.YES, Field.Index.TOKENIZED));
doc.Add(new Field("介绍", "王者,为领导也,小而不微,明日有为也。", Field.Store.YES, Field.Index.NO_NORMS));
//构造出记录(docment)
Document document = new Document();
document.Add(new Field("名字", "泰迪", Field.Store.YES, Field.Index.TOKENIZED));//第三个参数应该表示是否对这个值做分词,没做深入研究
document.Add(new Field("介绍", "泰迪者,为小明也。泰迪者,亦为一流行玩具", Field.Store.YES, Field.Index.TOKENIZED));
//将每一条记录加入到IndexWriter,也就加入了索引
indexWriter.AddDocument(doc);//将数据记录写入 索引写入流,即 加入索引库
indexWriter.AddDocument(document);
indexWriter.Optimize();//索引优化
indexWriter.Close();//关闭索引流
#endregion
}


这是站点的一个页面的后台代码,创建索引按钮响应事件。

程序中注释很详细。

接下来是搜索

]    protected void BtnSearch_OnClick(object sender, EventArgs e)
{
#region DEMO
indexDirectory = Server.MapPath("Index2");
//指定的只读 的 索引搜索对象,指定该对象指向的文件的索引,在该索引上进行搜索
IndexSearcher indexSearcher = new IndexSearcher(indexDirectory);
//Query为抽象类,他有多个实现,比如 TermQuery, BooleanQuery, PrefixQuery. ,主要工作为将用户的 查询字符转换为 lucene可识别的query
MultiFieldQueryParser multiFieldQueryParser = new MultiFieldQueryParser(new string[] { "名字", "介绍" }, analyzer);/多字段查询,其实简单的 用单字段查询(QueryParser)就行了。
Query query = ((QueryParser)multiFieldQueryParser).Parse(txtWebsiteName.Text);
//利用indexSearch,根据已经转化过的query进行查询,结果保存在hits中
Hits hits = indexSearcher.Search(query);//根据查询语句得到匹配集(查询结果)
DataTable dataTable = new DataTable();
dataTable.Columns.Add("名字");
dataTable.Columns.Add("介绍");
SimpleHTMLFormatter simpleHtmlFormatter = new SimpleHTMLFormatter("<font color=/"red/"><B>", "</B></font>");
Highlighter highlighter = new Highlighter(simpleHtmlFormatter, new QueryScorer(query));
//便利结果匹配集输出查询的结果集
for (int i = 0; i < hits.Length(); i++)
{
string name = hits.Doc(i).Get("名字");
string description = hits.Doc(i).Get("介绍");
TokenStream tokenStream = analyzer.TokenStream("介绍", new StringReader(description));
name = highlighter.GetBestFragment(tokenStream, description);//高亮显示用的
dataTable.Rows.Add(name, description);
}
MyRepeater.DataSource = dataTable;//绑定asp Repeater控件
MyRepeater.DataBind();
indexSearcher.Close();
}


天晚了,明天丫的还有课,就不写了。。

先这样吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: