最近在学习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(); }
天晚了,明天丫的还有课,就不写了。。
先这样吧。