前言:最近翻开了之前老杨(杨中科)的Lucene.Net站内搜索项目的教学视频,于是作为老杨脑残粉的我又跟着复习了一遍,学习途中做了一些笔记也就成了接下来您看到的这篇博文,仅仅是我的个人笔记,大神请呵呵一笑而过。相信做过站内搜索的.Net程序员应该对Lucene.Net不陌生,没做过的也许会问:就不是个查询嘛!为什么不能使用Like模糊查找呢?原因很简单:模糊查询的契合度太低,匹配关键字之间不能含有其他内容。最重要的是它会造成数据库全表扫描,效率低下,即使使用视图,也会造成数据库服务器"亚历山大"!因此,有必要了解一下Lucene.Net这个神器(也许现在早已不是)!

借助 Lucene.Net 构建站内搜索引擎(上)

  

Lucene.Net只是一个全文检索开发包,不是一个成型的搜索引擎。

它的功能就是负责将文本数据按照某种分词算法进行切词,分词后的结果存储在索引库中,从索引库检索数据的速度灰常快。

  对以上加粗的词汇稍作下阐述:

  文本数据:Lucene.Net只能对文本信息进行检索,所以非文本信息要么转换成为文本信息,要么你就死了这条心吧!

  分词算法:将一句完整的话分解成若干词汇的算法  常见的一元分词(Lucene.Net内置就是一元分词,效率高,契合度低),二元分词,基于词库的分词算法(契合度高,效率低)...

  切词:将一句完整的话,按分词算法切成若干词语

       比如:"不是所有痞子都叫一毛" 这句话,如果根据一元分词算法则被切成: 不 是 所 有 痞 子 都 叫 一 毛 

     如果二元分词算法则切成: 不是 是所 所有 有痞 痞子 子都 都叫 叫一  一毛

     如果基于词库的算法有可能:不是 所有 痞子 都叫 一毛 具体看词库

  索引库:简单的理解成一个提供了全文检索功能的数据库,见下图所示:

借助 Lucene.Net 构建站内搜索引擎(上)

二、几种分词的使用

  毫无疑问,Lucene.Net中最核心的内容就是分词,下面我们来体验一下基本的一元分词、二元分词以及基于词库分词的代表:盘古分词。首先,我们准备一个ASP.Net Web项目(这里使用的是WebForms技术),引入Lucene.Net和PanGu的dll,以及加入CJK分词的两个class(均在附件下载部分可以下载),分词演示Demo的项目结构如下图所示:

借助 Lucene.Net 构建站内搜索引擎(上)

2.1 一元分词

  核心代码

    protected void btnGetSegmentation_Click(object sender, EventArgs e)
    {
        string words = txtWords.Text;
        if (string.IsNullOrEmpty(words))
        {
            return;
        }

        Analyzer analyzer = new StandardAnalyzer(); // 标准分词 → 一元分词
        TokenStream tokenStream = analyzer.TokenStream("", new StringReader(words));
        Token token = null;
        while ((token = tokenStream.Next()) != null) // 只要还有词,就不返回null
        {
            string word = token.TermText(); // token.TermText() 取得当前分词
            Response.Write(word + "   |  ");
        }
    }
View Code

相关文章:

  • 2021-08-18
  • 2021-06-03
  • 2022-02-08
  • 2021-10-22
  • 2021-12-30
  • 2021-10-25
猜你喜欢
  • 2021-09-03
  • 2021-12-22
  • 2022-12-23
  • 2021-09-01
  • 2021-12-28
相关资源
相似解决方案