lucene(三)分词

分词

lucene在查询和建立索引文件的过程中,都是基于语素单元来操作的。而分词就是将查询语句,转换为一个个单独的语素单元。
主要通过Analyzer类解析实现,Analyzer通过调用TokenStream来实现。

分词的主要架构:

Analyzer

    常用的有:

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

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

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

        如:I am coder----I  am  coder 

    analyzer类的结构

        ![这里写图片描述](http://img.blog.csdn.net/20150603114018052)

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

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

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

一般处理流程

分词器主要流程

第一步:reader对象读取分词数据
第二步:Tokenier 负责将一组数组分解为一个个的单元
    如:I am coder----I  am  coder
第三步:经过多重过滤器对分词数据进行过滤操作。过滤的作用是去除停留词,并形态还原,统一大小写等。
    去除停留词就是去除类似in of等没有确切含义的词,形态还原则是将过去分词、过去式这样的词还原为原来的形态。如:termming-term。

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

lucene(三)分词的相关文章

当前几个主要的Lucene中文分词器的比较

1. 基本介绍: paoding:Lucene中文分词"庖丁解牛" Paoding Analysis imdict :imdict智能词典所采用的智能中文分词程序 mmseg4j: 用 Chih-Hao Tsai 的 MMSeg 算法 实现的中文分词器 ik :采用了特有的"正向迭代最细粒度切分算法",多子处理器分析模式 2. 开发者及开发活跃度: paoding :qieqie.wang, google code 上最后一次代码提交:2008-06-12,svn

lucene+盘古分词

一般的网站都会有都会有搜索的功能,一般实现搜索主要有三种方案 第一种是最差的,也是最不推荐的,使用数据库的模糊查询例如select * form table where 字段 like XXX,这种查询的缺点很明显: (1)       无法查找几个关键词不连在一起的情况 (2)       全表扫描 效率低下 第二种:使用SqlServer的全文本检索功能 举例:select * form table where msg = ‘江苏南京’ 这是就可以写成select * form table

lucene中文分词——(四)

1.分析器的执行过程: 第一个 TokenFilter将大写字母变为小写,第二次分词去掉空格并换行,第三次去掉不要的 and或者标点符号 2.中文分词器介绍: (1)lucene自带的 (2)第三方的 3.查看标准分词器对中文的分词效果: 最终决定使用的是IKAnalyzer()分词器,支持中文扩展与停用. 1 // 查看标准分析器的分词效果 2 @Test 3 public void testTokenStream() throws Exception { 4 // 创建一个标准分析器对象 5

(转)Lucene中文分词图解

本文记录Lucene+Paoding的使用方法图解: 一.下载Lucene(官网:http://archive.apache.org/dist/lucene/java/)本文中使用的是:2.9.4,下载后解压,Lucene所需要的基本jar文件如下列表: lucene-core-2.9.4.jar                   Lucene核心jar lucene-analyzers-2.9.4.jar            Lucene分词jar lucene-highlighter-2

lucene 分词的一些杂谈

找遍了网上所有的中文的分词工具,没有一个可以拿来用的,所以决定还是自己做一个分词的工具把,分词的核心功能: 1.分词基础算法(常见的有正向最大,逆向最大,最多分词,基于统计,基于理解即无词库分词等,当然一个好的搜索引擎必然是基于多种分词方式的) 2.是否支持强制一元分词:这个是商业的搜索引擎必备的. 3.同义词识别,简体中文和繁体中文的识别对应转换,中文和拼音的互转 4.支持中文分词的时候是否考虑好了英文的处理:难免会遇到英文文档,和中英混合的文档 5.特殊内容的处理: 邮箱处理.电话号码的处理

lucene自定义分词器

工作上,有需要对纯数字的字符串做分词,好像CJK二元分词器对这样的数字不会做分词,所以自己写了个分词器,分词器达到以下效果:对字符串1234567,分词后为:12 34 56 7 Analyzer: package org.apache.lucene.analysis.core; import java.io.Reader; import java.io.StringReader; import org.apache.lucene.analysis.Analyzer; import org.ap

java+lucene中文分词,来看看百度究竟是怎么找到你想要的(十分重要,楼主幸苦之作)

我想只要是学过数据库的孩纸,不管是mysql,还是sqlsever,一提到查找,本能的想到的便是like关键字,其实去转盘网(分类模式)之前也是采用这种算法,但我可以告诉大家一个很不幸的事情,like匹配其实会浪费大量的有用资源,原因这里不说了请自己想一想,我们还是直接摆事实验证. 现在用去转盘网搜:hello 找个单词,如下: http://www.quzhuanpan.com/source/search.action?q=hello&currentPage=1 翻页你会发现只要是包含hell

Lucene中文分词

package com.fxr.test2; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import net.paoding.analysis.analyzer.PaodingAnalyzer; import org.apache.lucene.an

Lucene查看分词结果

作者:xsi640 /** * 获取分词结果 * @param 输入的字符串 * @param 分词器 * @return 分词结果 */ public static List<String> getWords(String str,Analyzer analyzer){ List<String> result = new ArrayList<String>(); TokenStream stream = null; try { stream = analyzer.to

lucene中文分词搜索的核心代码

public static void search(String indexDir,String q)throws Exception{ Directory dir=FSDirectory.open(Paths.get(indexDir)); IndexReader reader=DirectoryReader.open(dir); IndexSearcher is=new IndexSearcher(reader); // Analyzer analyzer=new StandardAnaly