之前想做lucene的中文分词,上网一搜,结果都是针对lucene2.x的,于是就写了一实例针对lucene3.x版本的,以下仅为学习交流之用;
时间仓促,实例示下:
package com.hpjianhua.lucene;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.tokenattributes.TermAttribute;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;
/**
* 分词器测试类,支持lucene3.0以上版本
* 分词器IKAnalyzer3.2.5Stable.jar
* @author hpjianhua
* @Date 2011 04 08
*
*/
public class TokenTest {
// 要分词的字符串
private static String text = "中国,古时通常泛指中原地区,与中华中夏 中土中州含义相同。古代华夏族、汉族建国于黄河流域一带,以为居天下之中,故称中国";
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
Analyzer ikAnalyzer = new IKAnalyzer();
System.out.println("======中文=======IKAnalyzer======分词=======");
showToken(ikAnalyzer, text);
Analyzer standardAnalyzer = new StandardAnalyzer(Version.LUCENE_30);
System.out.println("=====一元========StandardAnalyzer=====分词========");
showToken(standardAnalyzer, text);
}
/**
* 分词及打印分词结果的方法
* @param analyzer 分词器名称
* @param text 要分词的字符串
* @throws IOException 抛出的异常
*/
public static void showToken(Analyzer analyzer, String text) throws IOException {
Reader reader = new StringReader(text);
TokenStream stream = (TokenStream)analyzer.tokenStream("", reader);
//添加工具类 注意:以下这些与之前lucene2.x版本不同的地方
TermAttribute termAtt = (TermAttribute)stream.addAttribute(TermAttribute.class);
OffsetAttribute offAtt = (OffsetAttribute)stream.addAttribute(OffsetAttribute.class);
// 循环打印出分词的结果,及分词出现的位置
while(stream.incrementToken()){
System.out.print(termAtt.term() + "|("+ offAtt.startOffset() + " " + offAtt.endOffset()+")");
}
System.out.println();
}
}
输出结果如下:
======中文=======IKAnalyzer======分词=======
中国|(0 2)古时|(3 5)通常|(5 7)泛指|(7 9)中原地区|(9 13)中原|(9 11)原地区|(10 13)原地|(10 12)地区|(11 13)与|(14 15)中华|(15 17)华中|(16 18)中夏|(17 19)中土|(20 22)中州|(22 24)含义|(24 26)相同|(26 28)古代|(29 31)华夏|(31 33)夏|(32 33)族|(33 34)汉族|(35 37)建国|(37 39)于|(39 40)黄河流域|(40 44)黄河|(40 42)河流|(41 43)流域|(42 44)一带|(44 46)一|(44 45)以为|(47 49)居|(49 50)天下|(50 52)之中|(52 54)故|(55 56)称|(56 57)中国|(57 59)
=====一元========StandardAnalyzer=====分词========
中|(0 1)国|(1 2)古|(3 4)时|(4 5)通|(5 6)常|(6 7)泛|(7 8)指|(8 9)中|(9 10)原|(10 11)地|(11 12)区|(12 13)与|(14 15)中|(15 16)华|(16 17)中|(17 18)夏|(18 19)中|(20 21)土|(21 22)中|(22 23)州|(23 24)含|(24 25)义|(25 26)相|(26 27)同|(27 28)古|(29 30)代|(30 31)华|(31 32)夏|(32 33)族|(33 34)汉|(35 36)族|(36 37)建|(37 38)国|(38 39)于|(39 40)黄|(40 41)河|(41 42)流|(42 43)域|(43 44)一|(44 45)带|(45 46)以|(47 48)为|(48 49)居|(49 50)天|(50 51)下|(51 52)之|(52 53)中|(53 54)故|(55 56)称|(56 57)中|(57 58)国|(58 59)
分享到:
相关推荐
IKAnalyzer是一款开源的、基于Java实现的中文分词工具,它最初是为Lucene搜索引擎设计的,但随着时间的发展,已经逐渐成为一个独立的、可扩展的分词系统,能够很好地兼容高版本的Lucene。 首先,我们需要了解IK...
分词器的配置是灵活的,可以根据需求选择不同的分词策略,比如标准分词器(StandardAnalyzer)适用于大多数英文文本,而中文分词可能需要使用IKAnalyzer或SmartChineseAnalyzer等针对中文特性的分词器。 在运行这个...
然而,对于中文分词,我们需要使用专门针对中文的 Analyzer,如 IKAnalyzer、SmartChineseAnalyzer 或 HanLP 分词库。这些分析器内置了中文分词规则和词典,能够更准确地将中文文本切分成有意义的词语。例如,IK...
对于中文,我们可以使用IKAnalyzer、SmartChineseAnalyzer或其他专门为中文设计的分词器,以更好地理解和拆分中文词汇。 索引创建完成后,我们可以通过IndexWriter接口进行修改和删除操作。IndexWriter允许我们添加...
Lucene支持多种分词器,如StandardAnalyzer、IKAnalyzer等,选择合适的分词器对提高搜索精度至关重要。 3. **创建索引**:使用Lucene的`IndexWriter`类,将预处理后的数据转换为Lucene的文档(Document)对象,并...
IndexWriter配置了各种参数,如分词器(Analyzer)、写入模式等。接着,通过addDocument()方法将一个个文档添加到索引中。每个文档由多个Field对象构成,每个Field包含特定的文本内容和属性,如是否存储原始内容、...
不同的语言可能需要不同的分词器,例如英文的 StandardAnalyzer 和中文的 IKAnalyzer。 4. **术语(Term)**:分词后的结果称为术语,它是 Lucene 搜索的基本单元。 5. **倒排索引(Inverted Index)**:这是 ...
在本案例中,我们使用的是 IKAnalyzer,这是一个针对中文的开源分词器,能较好地处理中文分词问题。 4. **索引writer(IndexWriter)**:负责创建或更新索引。我们可以向 IndexWriter 添加文档,然后调用 commit() ...
但也可以根据需求选择或自定义其他分析器,比如针对中文的IK Analyzer。 5. 扩展与优化 Lucene提供许多高级特性,如评分系统、布尔查询、短语查询、模糊查询、近似搜索等。此外,可以通过缓存、多线程和优化索引等...
- 使用合适的分析器:根据应用需求选择合适的分析器,例如英文的StandardAnalyzer或中文的IKAnalyzer。 - 调优索引性能:合理设置索引参数,如缓冲区大小、合并策略等,以平衡速度与磁盘空间。 - 多线程处理:...
然后,根据项目需求选择合适的Analyzer,例如标准Analyzer用于处理英文文本,中文则通常使用IKAnalyzer或SmartChineseAnalyzer。 三、创建索引 1. 创建索引目录:使用Directory类(如FSDirectory)创建一个文件...
对于中文,可以选择IKAnalyzer或其他针对中文优化的Analyzer。 2. **创建Directory**: Directory是Lucene中存储索引的地方,它可以是内存中的RAMDirectory,也可以是磁盘上的FSDirectory。 3. **创建IndexWriter**...
在实际应用中,除了这些基本操作,还需要了解其他Lucene组件,如Filter(用于进一步筛选结果)、Sort(用于结果排序)、分词器(如StandardAnalyzer、IKAnalyzer等)以及高级查询构造如BooleanQuery、PhraseQuery、...
此外,还可以结合IKAnalyzer、HanLP等第三方分词库增强中文处理能力。 ### 5. 扩展与优化 - **Memory Management**: 使用Lucene的段合并策略控制内存使用,避免一次性加载大量索引数据。 - **多线程索引和搜索**:...
例如,如果你处理的是中文文本,可以选择`StandardAnalyzer`或`IKAnalyzer`(针对中文的分词器)。 4. **创建IndexWriter**:使用`Directory`对象(如`FSDirectory`)和Analyzer创建`IndexWriter`实例,`...
开发者可以根据需求选择不同的分析器,例如标准分析器(StandardAnalyzer)用于处理英文文本,而中文则需要使用如 IK 分析器(IKAnalyzer)。 2. **Document**: 文档对象代表要索引的信息,可以包含多个字段(Field...
3. 在创建IndexWriter对象时,可以使用IK分词器实例替代默认的StandardAnalyzer。通过IndexWriterConfig的构造方法传入所需的分词器实现。 4. 在创建查询语句时,可以使用不同的查询对象,如TermQuery,从而根据需要...
在本例中,可能使用了默认的StandardAnalyzer,针对中文可能还使用了IKAnalyzer或其他中文分词器。 2. **Document**: 存储要索引的信息,如文件名、内容等,可以视为数据库中的记录。 3. **IndexWriter**: 负责...
Lucene对中文处理需要特殊的Analyzer,如`IKAnalyzer`或`SmartChineseAnalyzer`。这些Analyzer能对中文进行分词,便于索引和搜索。例如: ```java Analyzer analyzer = new IKAnalyzer(); ``` 3. **创建...
- **分词器的选择**:对于中文文档,通常会使用IK Analyzer这样的分词器来进行分词操作。而对于英文文档,则可以采用默认的StandardAnalyzer或其他适用于英文文本的分词器。 - **文档模型定义**:每个文档被定义为...