全文索引(三)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。
demo
public 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();
}
@Test
public void testCreateToken(){
//标准分词器。作为一般标准的分词器有自己智能的一面,
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的更多相关文章
- 学习笔记(三)--Lucene分词器详解
Lucene-分词器API org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分词处理的TokenStream(分词处理 ...
- Lucene系列三:Lucene分词器详解、实现自己的一个分词器
一.Lucene分词器详解 1. Lucene-分词器API (1)org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分 ...
- lucene分词器中的Analyzer,TokenStream, Tokenizer, TokenFilter
分词器的核心类: Analyzer:分词器 TokenStream: 分词器做优点理之后得到的一个流.这个流中存储了分词的各种信息,能够通过TokenStream有效的获取到分词单元. 下面是把文件流 ...
- lucene分词多种方法
目前最新版本的lucene自身提供的StandardAnalyzer已经具备中文分词的功能,但是不一定能够满足大多数应用的需要.另外网友谈的比较多的中文分词器还有:CJKAnalyzerChinese ...
- lucene分词器与搜索
一.分词器 lucene针对不同的语言和虚伪提供了许多分词器,我们可以针对应用的不同的需求使用不同的分词器进行分词.我们需要注意的是在创建索引时使用的分词器与搜索时使用的分词器要保持一致.否则搜索的结 ...
- Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息
Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息 在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从 ...
- Lucene分词详解
分词和查询都是以词项为基本单位,词项是词条化的结果.在Lucene中分词主要依靠Analyzer类解析实现.Analyzer类是一个抽象类,分词的具体规则是由子类实现的,所以对于不同的语言规则,要有不 ...
- lucene 分词器
分词器 作用:切分关键词的. 在什么地方使用到了:在建立索引和搜索时. 原文:An IndexWriter creates and maintains an index. 1,切分: An Index ...
- 爬虫系统Lucene分词
思路:查询数据库中信息,查询出id和name把那么进行分词存入文件 package com.open1111.index; import java.io.IOException;import java ...
随机推荐
- angular分页指令
目前的多个项目中都用到分页这个功能,为了提高可复用性,我特地分离出来写了个分页的指令.直接贴代码,详情如下: index.html <body id="sBill" ng-c ...
- Stanford CoreNLP--Split Sentence
分句功能参考 Stanford Tokenizer. 在edu.stanford.nlp.pipeline包中实现了一系列分词分句功能,其中SentenceAnnotator类实现了对文件分句功能. ...
- async await 异步编程杂记
1. async 仅仅是用了标记 方法中有异步调用(就是有await...) 2 await 用来把「当前线程」中的代码“分成片”,通过一定条件和事件回调的形式 “依次执行”. 3. await ...
- 【HDOJ】3127 WHUgirls
#include <stdio.h> #include <string.h> #define mymax(a, b) (a>b) ? a:b typedef struct ...
- pcDuino汉化方法
1,打开终端:2,在终端输入命令 sudo apt-get update 更新一下软件源3, 输入命令下载中文支持包 sudo apt-get install language-pack-gnome- ...
- sharepoint 2010 如何创建文档库内容类型content type
转:http://biancheng.dnbcw.info/linux/441643.html 这次主要是记录下,如何来创建文档内容类型,例如新建文档的时候,可以选择不同模板,有word,excel文 ...
- Android Volley - volley StringRequest編碼問題
有些時候這個類並不能很好的解決中文編碼問題 如果出現亂碼,就 要重寫該類的parseNetworkResponse 方法了. 繼承StringRequest,然後重寫parseNetworkRespo ...
- HDU-2711 Lost Cows
Lost Cows Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 最佳化常用测试函数 Optimization Test functions
http://www.sfu.ca/~ssurjano/optimization.html The functions listed below are some of the common func ...
- Normal Vector Using WorldInverseTranspose
shader里面经常看到normal向量是用WorldInverseTranspose矩阵做变换的,有时候也可以用WorldMatrix变换. 原理: If your object is only e ...