专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » lucene分词:Lucene.Net 2.3.1开发介绍 2、分词( 2) »正文

lucene分词:Lucene.Net 2.3.1开发介绍 2、分词( 2)

来源: 发布时间:星期四, 2009年1月15日 浏览:2次 评论:0
  1.2、分词过程

  1.2.1、分词器工作过程

  内置分词器效果都不好那如何办?只能自己写了!在写的前当然是要先看看内置分词器是如何实现从1.1分析分词效果可以看出KeywordAnalyzer这个分词器最懒惰基本什么事情也没做并不是它不会做而是我们没找到使用它思路方法就像手上拿着个盒子不知道里面是什么就不知道这个是干嘛有什么用打开盒子那就是要查看源代码了!

  代码 1.2.1.1

  Code

1using ;
2
3 Lucene.Net.Analysis
4{
5  
6  /**//// <summary> "Tokenizes" the entire stream as a single token. This is useful
7  /// for data like zip codes, ids, and some product names.
8  /// </summary>
9  public KeywordAnalyzer : Analyzer
10  {
11    public override TokenStream TokenStream(.String fieldName, .IO.TextReader reader)
12    {
13       KeywordTokenizer(reader);
14    }
15
16    public override TokenStream ReusableTokenStream(.String fieldName, .IO.TextReader reader)
17    {
18      Tokenizer tokenizer = (Tokenizer)GetPreviousTokenStream;
19       (tokenizer null)
20      {
21        tokenizer = KeywordTokenizer(reader);
22        SetPreviousTokenStream(tokenizer);
23      }
24      
25        tokenizer.Re(reader);
26       tokenizer;
27    }
28  }
29}


  代码1.2.1.1 就是传说中源码了先看看注释意思大体是“‘Tokenizes’整体流变成个个词这个特别适用于邮编ID和商品名称”Tokenizes应该是拆分意思字典上查不到这个词

  这段代码比较简单只有两个思路方法而第 2个思路方法就是我们先前分析结果时候用(见段落1.1)关键点就在于了KeywordTokenizer类切到KeywordTokenizer类查看

  代码1.2.1.2

  Code

1using ;
2
3 Lucene.Net.Analysis
4{
5  
6  /**//// <summary> Emits the entire input as a single token.</summary>
7  public KeywordTokenizer : Tokenizer
8  {
9    
10    private const DEFAULT_BUFFER_SIZE = 256;
11    
12    private bool done;
13    
14    public KeywordTokenizer(.IO.TextReader input) : this(input, DEFAULT_BUFFER_SIZE)
15    {
16    }
17    
18    public KeywordTokenizer(.IO.TextReader input, bufferSize) : base(input)
19    {
20      this.done = false;
21    }
22
23    public override Token Next(Token result)
24    {
25       (!done)
26      {
27        done = true;
28         upto = 0;
29        result.Clear;
30        char buffer = result.TermBuffer;
31        while (true)
32        {
33           length = input.Read(buffer, upto, buffer.Length - upto);
34           (length <= 0)
35            ;
36          upto length;
37           (upto buffer.Length)
38            buffer = result.ResizeTermBuffer(1 + buffer.Length);
39        }
40        result.termLength = upto;
41         result;
42      }
43       null;
44    }
45
46    public override void Re(.IO.TextReader input)
47    {
48      base.Re(input);
49      this.done = false;
50    }
51  }
52}


  代码 1.2.1.2 就是KeywordTokenizer源码代码量很小却没有完成全部工作而是将部分工作交给了父类关注Lucene人都可以知道新版本中分词这里换掉了现在多了个重载Next思路方法这里不讨论为什么要加这个重载这篇文章主要是讲应用取词是用Next思路方法走那么只需要关注Next思路方法就可以了KeywordTokenizer父类是Tokenizer但是在Tokenizer里找不到我们想要关系但是Tokenizer又继承自TokenStream查看TokenStream类

  代码 1.2.1.3

  Code

1
2using ;
3
4using Payload = Lucene.Net.Index.Payload;
5
6 Lucene.Net.Analysis
7{
8  
9  /**//// <summary>A TokenStream enumerates the sequence of tokens, either from
10  /// fields of a document or from query text.
11  /// <p>
12  /// This is an abstract . Concrete subes are:
13  /// <ul>
14  /// <li>{@link Tokenizer}, a TokenStream
15  /// whose input is a Reader; and
16  /// <li>{@link TokenFilter}, a TokenStream
17  /// whose input is another TokenStream.
18  /// </ul>
19  /// NOTE: subes must override at least _disibledevent= 0;
92    }
93  }
94}




  天公不作美刚看到简单就来了个长无奈中不过为什么要多重继承呢?那就是有其他分词器也用到CharTokenizer了而WhitespaceTokenizer中没有重写Next思路方法而只是重写了IsTokenChar思路方法几乎可以肯定这个IsTokenChar才是重点IsTokenChar故名思意看注释果然!这个思路方法是判断是否遇到了分词这个其实和Split思路方法相似注意到Next思路方法有关IsTokenChar逻辑那果然是这样分词实际上就是拆分串嘛



相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: