初学:DotLucene

本系列笔记将以DotLucene的命名空间组织行文,阅读的DotLucene版本是1.9.RC1,并且以更好的使用而非研究为目的阅读。也就是说要避难就易拉。 [!21ki@][@21ki!]
0), DotLucene主要命名空间概览:
[!21ki@][@21ki!]
命名空间 [!21ki@][@21ki!]
功能说明 [!21ki@][@21ki!]
Lucene.Net.Analysis [!21ki@][@21ki!]
语言分析器,主要用于切词,支持中文主要是扩展此类 [!21ki@][@21ki!]
Lucene.Net.Documents [!21ki@][@21ki!]
索引存储时的文档结构管理,类似关系型数据库的表结构 [!21ki@][@21ki!]
Lucene.Net.Index [!21ki@][@21ki!]
索引管理,包括索引建立、删除等 [!21ki@][@21ki!]
Lucene.Net.QueryParsers [!21ki@][@21ki!]
查询分析器,实现查询关键词间的运算,如与、或、非等 [!21ki@][@21ki!]
Lucene.Net.Search [!21ki@][@21ki!]
检索管理,根据查询条件,检索得到结果 [!21ki@][@21ki!]
Lucene.Net.Store [!21ki@][@21ki!]
数据存储管理,主要包括一些底层的 I/O 操作 [!21ki@][@21ki!]
Lucene.Net.Util [!21ki@][@21ki!]
一些公用类 [!21ki@][@21ki!]
  [!21ki@][@21ki!]
 
1), Lucene.Net.Analysis命名空间分析。 [!21ki@][@21ki!]
Lucene.Net.Analysis下,类的关系,可以看成有三个继承体系: [!21ki@][@21ki!]
词法分析器(Analyzer) : 词法过滤和分析的类,实际上是对 分词器, 过滤器的综合包装类。 [!21ki@][@21ki!]
分词器(Tokenizer):对文本进行分词,可能是单字,词,二元切分等等。 [!21ki@][@21ki!]
过滤器(TokenFilter):对由分词器分词后的Token进行过滤,比如无意词(a ,是,的等等)或者其他的指定的需要过滤的词 [!21ki@][@21ki!]
下面看看每一个 继承体系都有那些相关类: [!21ki@][@21ki!]
 
词法分析器(Analyzer)的相关类类关系图:[!
 
 
 
分词器(Tokenizer) 的相关类类关系图:[!
 
 
 

过滤器(TokenFilter) 的相关类类关系图: [!21ki

 上面的三个类关系体系里涉及到的主要类(概念)的简单说明:

@][@21ki!]

类名 [!21ki@][@21ki!]
功能说明 [!21ki@][@21ki!]
Analyzer [!21ki@][@21ki!]
分析器基类, 词法过滤和分析的类 ,即把文本分解成TokenStream,即Token的序列。Analyzer只是做包装,主要还是Tokenizer在起作用 [!21ki@][@21ki!]
StopAnalyzer [!21ki@][@21ki!]
Analyzer扩展类之一,SimpleAnalyzer功能基础上加上过滤词功能 [!21ki@][@21ki!]
StandardAnalyzer [!21ki@][@21ki!]
Analyzer扩展类之一,也是最常用的分析器,支持中文,日文等,单字切分。 [!21ki@][@21ki!]
SimpleAnalyzer [!21ki@][@21ki!]
Analyzer扩展类之一, 将除去字符之外的符号全部过滤掉,并且将所有的字符小写(大写)化 [!21ki@][@21ki!]
Token [!21ki@][@21ki!]
DotLucene最基本的单位,以单字切分则每个单字为一个Token,如果以中文分词来切分则每个词为一个Token [!21ki@][@21ki!]
TokenStream [!21ki@][@21ki!]
Token的序列 [!21ki@][@21ki!]
Tokenizer [!21ki@][@21ki!]
继承于TokenStream,用于分词。一般扩展的自定义的分词都应该继承这个类 [!21ki@][@21ki!]
  [!21ki@][@21ki!]
  [!21ki@][@21ki!]
StandardTokenizer [!21ki@][@21ki!]
Tokenizer扩展类之一,也是最常用的,支持中文,基于单字切分 [!21ki@][@21ki!]
TokenFilter [!21ki@][@21ki!]
继承于TokenStream的子类,用于过滤。一般拓展的自定义的过滤类都应该继承该类 [!21ki@][@21ki!]
StandardFilter [!21ki@][@21ki!]
TokenFilter拓展类之一,过滤英文字符的复数和dot(.)号. [!21ki@][@21ki!]
LowerCaseFilter [!21ki@][@21ki!]
对所有英文小写化 [!21ki@][@21ki!]
StopFilter [!21ki@][@21ki!]
过滤掉指定的过滤词 [!21ki@][@21ki!]

s

 在所有上面这个类之中,我们经常用的也是所有Analyzer中最复杂的就是StandardAnalyzer(本身不复杂,其调用的分词器复杂),下面对这个类做一个简单的分析:[!21ki@][@21ki!]
StandardAnalyzer最核心,最主要的方法:[!21ki@][@21ki!]
[!21ki@][@21ki!]


 

         public override TokenStream TokenStream(System.String fieldName, System.IO.TextReader reader) [!21ki@][@21ki!]
         { [!21ki@][@21ki!]
              TokenStream result = new StandardTokenizer(reader); [!21ki@][@21ki!]
              result = new StandardFilter(result); [!21ki@][@21ki!]
              result = new LowerCaseFilter(result); [!21ki@][@21ki!]
              result = new StopFilter(result, stopSet); [!21ki@][@21ki!]
              return result; [!21ki@][@21ki!]
         } [!21ki@][@21ki!]
就是调用StandardTokenizer分词器对文本分词。然后调用三个过滤器(作用表格有写),其中的StandardTokenizer类及相关的类比较复杂,目前还没有完全理解。所以下面的文字是需要用批判眼光来阅读的。说白了,我是一边猜,一边看源码。以求的最准确的理解。 [!21ki@][@21ki!]
先做个简单的测试,通过结果来分析: [!21ki@][@21ki!]
string sTemp = "我们是中国人,We are chinese"; [!21ki@][@21ki!]
            Analyzer analyzer = new StandardAnalyzer() ; [!21ki@][@21ki!]
            StringReader sr = new StringReader(sTemp); [!21ki@][@21ki!]
            TokenStream ts = analyzer.TokenStream(sr); [!21ki@][@21ki!]
            Lucene.Net.Analysis.Token token = null; [!21ki@][@21ki!]
            while ((token = ts.Next()) != null) [!21ki@][@21ki!]
            { [!21ki@][@21ki!]
                this.txtResult.Text += token.ToString(); [!21ki@][@21ki!]
            } [!21ki@][@21ki!]
txtResult是Winform的TextBox,输出结果如下: [!21ki@][@21ki!]
(我,0,1,type=<CJ>)(们,1,2,type=<CJ>)(是,2,3,type=<CJ>)(中,3,4,type=<CJ>)(国,4,5,type=<CJ>)(人,5,6,type=<CJ>)(we,7,9,type=<ALPHANUM>)(chinese,14,21,type=<ALPHANUM>) [!21ki@][@21ki!]
  [!21ki@][@21ki!]
拿(我,0,1,type=<CJ>)来分析,因为是单字切分,所以分解成了一个一个的字。其中0,1表示”我”这个字在文本中 StartOffset,EndOffset,最后的type表示文字的类型是英文,数字,还是是中文等等。在rc1.9中支持的type可以在 Lucene.Net.Analysis.Standard下的StandardTokenizerConstants类看到。而CJ代表的是中文和日文的集合。不仅仅代表中文哦。 [!21ki@][@21ki!]
分析到这里,我有一个疑问。DotLucene是怎么区别不同的文字的呢?那就是根据unicode编码的范围区别不同的文字。不过这句话,是我 猜出来,但我始终没能在DotLucene源码中找到能支持我这句话的原代码。所以猜测始终还是猜测。鉴于本次阅读DotLucene的目的是为了更好的使用,而非研究,所以对Lucene.Net.Analysis命名空间的分析只能就此打住。 [!21ki@][@21ki!]
  [!21ki@][@21ki!]
后记: [!21ki@][@21ki!]
据我所知,现在已经有很多种第三方的Analyzer。SourceForce上的有一个ChineseAnalyzer,基于二元分词算法实现中文分词。还有基于词库实现中文分词的Analyzer,一般认为。使用针对中文优化过的Analyzer可以提高搜索准确度,但是对于大多数的搜索应用,StandardAnalyzer 绝对够用,好用。为什么呢?打个比方,拿 国际经济 四个字来说,如果是StandardAnalyzer的话,无论搜索 国际,经济,还是国际经济都能搜索到。但是如果用中文分词,那就难说。那就看你的中文分词怎么分 国际经济 拉(二元分词算法的Analyzer不需要考虑这个问题)。我在给CS做的搜索系统,也是用StandardAnalyzer,绝对不用其他的Analyzer。以上纯属个人拙见。 [!21ki@][@21ki!]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值