§ ITPOW >> 文档 >> C#

盘古 + Lucene 实现 .NET 分词 + 全文检索-全文检索

作者:vkvi 来源:ITPOW(原创) 日期:2017-6-29

在本连载前一节中,我们提到了有个下载地址,这里面还有两个重要 DLL:Lucene.Net.dllPanGu.Lucene.Analyzer.dll,是用于全文检索的,PanGu.Lucene.Analyzer 是盘古针对 Lucene 写的分析器,我们也可以不用它的,比如可以用自带的:new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29)

盘古的文档中也提到了具体使用方法,但是它使用的一些方法是 Lucene 抛弃的方法,本文使用的是 Lucene 推荐的方法。

先还是照前一节的操作添加并引用 DLL。

创建索引

要使用全文检索,我们得把我们的文章加入索引。

  • Store.YES 检索时可以用 IndexSearcher.Doc(i).GetField 获取内容。
  • Store.NO 检索时不可用 IndexSearcher.Doc(i).GetField  获取内容,由于不保存内容所以节省空间。
  • Store.COMPRESS 检索时可以用 IndexSearcher.Doc(i).GetField 获取内容,可以节省生成索引文件的空间。

别人的教程中,IndexWriter 构造函数使用了另一个重载,即第三个参数为 bool,如果为 true 表示不存在就创建、存在就覆盖,为 false 表示不存在就出错、存在就追加。这个不方便,因为我们需要的是:不存在就创建、存在就追加,怎样才能实现这个功能呢?省略掉,就实现这个功能了。

检索

这里有几点说明:

  • 一是要写一个 GetKeyWordsSplitBySpace 方法。
  • 二是 QueryParser 是单字段搜索,多字段搜索用 MultiFieldQueryParser。或者也可用 PanGu 文档中的用法(代码见下)。二者效果是不太一样的。
  • 三是 Search 第二个参数是最大返回条数。
  • 四是如果我们搜“技术”,第二条“水稻栽培技术”就不出来结果,这是为什么呢?采用盘古分词,我们发现“机械维修技术”被分为:机械、维修、技术,而“水稻栽培技术”被分为:水稻、栽培技术,这下明白原因了吧。

最后结合前一节介绍的,就可实现摘要高亮

分词修改

前面说了关于这个分词,会影响搜索结果,我们可以用下载的文件包中的 DictManage.exe 来维护分词。

要说明两点:

  • 一是修改了分词,要保存。
  • 二是要重新用 IndexWriter 写入索引。
相关文章