全文索引(三)lucene 分词器 Analyzer

分词: 将reader读取的对象通过Analyzer分词器处理得到TokenStream流的过程称为分词。

可能这个解释太过晦涩,看一个例子,感性的认识一下这个东西。 例子:传入一段文本“this is jack’s house”,经过分词器处理之后得到可能为jack 、house。

这个过程中:this is 称之为停留词,这样的词是不会被存入索引文件的。这个主要通过StopAnalyzer分词器来实现,后面我们会讲。 jack’s 被转换为 jack 。诸如此类coming会被转换为come,所有的形式都会被最为原始的状态。 分词的过程主要由Analyzer类解析实现,而Analyzer通过调用TokenStream及其两个子类TokenFilter、Tokenizer来实现。

整体的结构类图如下

一. Analyzer

常用的有:

SimpleAnalyzer: 将查询语句转换为语素单元时完成转换为小写的操作。

StandardAnalyzer :最为常用的智能分词器,,通过这两个LowerCaseFilter和StopFilterTokenStream。能完成诸如邮件、字母分析处理。

WhitespaceAnalyzer :以空格为分词符进行分析处理。

如:I am coder—-

Lucene3.5 有9种分词器。继承Analyzer抽象类内部通过tokenStream(String fieldName, Reader reader)方法来处理读取的查询数据,Analyzer和不同子类分词器的实现,应该能看到组合模式的设计。

二. TokenStream

经过分词、过滤处理后的结果流。

主要通过public abstract boolean incrementToken() throws IOException 方法来实现分词后各语素的处理读取操作。 tokenFilter 和 Tokenizer两个子类来实现 去停留词和得到分词单元。

#三. 分词一般处理流程#

分词器主要流程

第一步:reader对象读取分词数据 第二步:Tokenier 负责将一组数组分解为一个个的单元 如:I am coder—-

第三步:经过多重过滤器对分词数据进行过滤操作。过滤的作用是去除停留词,并形态还原,统一大小写等。 去除停留词: 就是去除类似in of this 等没有确切含义的词,这些不会被当做分词单元。形态还原则是将过去分词、过去式这样的词还原为原来的形态。如:termming-term。demopublic void createToken(String strContent,Analyzer analyer){try {//1.创建TokenStream对象TokenStream tokenStream=analyer.tokenStream(“”, new StringReader(strContent));//charTermAttribute 保存了分词中的各个语素单元CharTermAttribute cta=tokenStream.addAttribute(CharTermAttribute.class);//PositionIncrementAttribute 保存分词各个语素单元的位置信息PositionIncrementAttribute pta=tokenStream.addAttribute(PositionIncrementAttribute.class);//OffsetAttribute 保存各语素单元的偏移量OffsetAttribute oab=tokenStream.addAttribute(OffsetAttribute.class);//读取分词单元的信息while(tokenStream.incrementToken()){System.out.println(“———-cta———=”+cta);System.out.println(“———-pta———=”+pta);System.out.println(“———-oab———=”+oab);}} catch (IOException e) {e.printStackTrace();}}private LuceneAnalyzerUtil luceneAnalyzer=null;public testAnalyzer(){luceneAnalyzer=new LuceneAnalyzerUtil();}(){//标准分词器,作为一般标准的分词器有自己智能的一面,Analyzer analyzer1=new StandardAnalyzer(Version.LUCENE_35);Analyzer analyzer2=new StopAnalyzer(Version.LUCENE_35);Analyzer analyzer3=new ClassicAnalyzer(Version.LUCENE_35);Analyzer analyzer4=new KeywordAnalyzer();Analyzer analyzer5=new WhitespaceAnalyzer(Version.LUCENE_35);luceneAnalyzer.createToken(“I am human,I am special”, analyzer1);luceneAnalyzer.createToken(“I am human,I am special”, analyzer2);luceneAnalyzer.createToken(“I am human,I am special”, analyzer3);luceneAnalyzer.createToken(“I am human,I am special”, analyzer4);luceneAnalyzer.createToken(“I am human,I am special”, analyzer5);}

总的来讲,lucene的分词器主要做了一个什么样的工作呢?从查询语句分解为一个个查询单元的工作。这么做的目的是为了lucene在查询时候更好的细粒度的去匹配已创建的索引文件。

志在山顶的人,不会贪念山腰的风景。

全文索引(三)lucene 分词器 Analyzer

相关文章:

你感兴趣的文章:

标签云: