使用IKanalyzer3.2+lucene3.0搜索一个文本内容,结果只能出现一条,其实能匹配很多条,下面是源代码:
package com.lucene.demo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.util.Date;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.FSDirectory;
import org.wltea.analyzer.lucene.IKAnalyzer;
import org.wltea.analyzer.lucene.IKQueryParser;
import org.wltea.analyzer.lucene.IKSimilarity;
public class CopyOfIKanalyzerDemoToo {
// 数据文件夹
private static final String DATA_DIR = "d:\\test\\file";
// 索引存放文件夹
private static final String INDEX_DIR = "d:\\test\\index";
// 字段
private static final String FIELD_NAME = "content";
//是否要优化
private static boolean optimize = true;
public static void main(String[] args) throws Exception {
createIndex();
// search("共和国", "content");
}
public static void createIndex() throws Exception {
boolean create = true;//是否重新创建索引文件,false:在原有的基础上追加
Analyzer analyzer = new IKAnalyzer(); //IK中文分词器
//创建索引
IndexWriter indexWriter = new IndexWriter(FSDirectory.open(new File(
INDEX_DIR)), analyzer, create,
IndexWriter.MaxFieldLength.UNLIMITED);
System.out.println("正在创建索引文件....");
long startTime = new Date().getTime();
indexDoc(indexWriter, new File(DATA_DIR));
if (optimize) {
indexWriter.optimize();
}
//最后关闭索引
indexWriter.close();
System.out.println("创建索引文件完成....总共花费时间:"
+ (new Date().getTime() - startTime));
}
public static void search(String query_str, String field) throws Exception {
IndexReader reader = IndexReader.open(FSDirectory.open(new File(
INDEX_DIR)), true);
IndexSearcher searcher = new IndexSearcher(reader);
searcher.setSimilarity(new IKSimilarity()); //在索引器中使用IKSimilarity相似度评估器
Query query = IKQueryParser.parse(field, query_str); //IKQueryParser多个字段搜索
IKAnalyzer analyzer = new IKAnalyzer();
TopScoreDocCollector topCollector = TopScoreDocCollector.create(
searcher.maxDoc(), false);
searcher.search(query, topCollector);
ScoreDoc[] docs = topCollector.topDocs().scoreDocs;
//关键字高亮显示的html标签,需要导入lucene-highlighter-3.0.3.jar
SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter(
"<font color='red'>", "</font>");
Highlighter highlighter = new Highlighter(simpleHTMLFormatter,
new QueryScorer(query));
for (int i = 0; i < docs.length; i++) {
Document doc = searcher.doc(docs[i].doc);
TokenStream tokenStream1 = analyzer.tokenStream("content",
new StringReader(doc.get("content")));
String content = highlighter.getBestFragment(tokenStream1, doc
.get("content"));
System.out.println("评分:" + docs[i].score);
System.out.println("路径:" + doc.get("path"));
System.out.println("内容:" + content);
}
reader.close(); //关闭索引
System.out.println("总共检索到记录:" + docs.length);
}
private static void indexDoc(IndexWriter writer, File root) {
// 不去索引不能读的文件
if (root.canRead()) {
if (root.isDirectory()) {
File[] files = root.listFiles();
if (files.length != 0) {
for (int i = 0; i < files.length; i++) {
// 递归调用
indexDoc(writer, files[i]);
}
}
} else {
try {
// 文件的文本内容
InputStream in = new FileInputStream(root);
byte b[] = new byte[in.available()];
in.read(b);
String content = new String(b, "GBK");
System.out.println("" + content);
// 创建一个lucene document
Document d = new Document();
// 把文件的文本内容添加进来 进行索引,保存
d.add(new Field(FIELD_NAME, content, Field.Store.YES,
Field.Index.ANALYZED,
Field.TermVector.WITH_POSITIONS_OFFSETS));
// 同时把path也加入进来,只存储,不索引
d.add(new Field("path", root.getAbsolutePath(),
Field.Store.YES, Field.Index.NOT_ANALYZED));
// 把document写入索引文件
writer.addDocument(d);
System.out.println("add file: " + root.getAbsolutePath());
} catch (FileNotFoundException e) {
System.out.println("file not found, ignored.");
e.printStackTrace();
} catch (IOException e) {
}
}
}
}
}
结果如下:
中华人民共和国(英文:The People's Republic of China,通常简称为中国(英文:China)[5],
位於亚洲东部、太平洋西岸,陆上从东北至西南分别与朝鲜、俄罗斯、蒙古、哈萨克斯坦、吉尔吉斯斯坦、塔吉克斯坦、
阿富汗、巴基斯坦、印度、尼泊尔、不丹、缅甸、老挝和越南等国家接壤,海上从东部至南部分别隔黄海、东海、南海与朝鲜半岛、日本列岛以及东南亚相望,是世界上陸地鄰國最多的國家,首都北京。国土辽阔,实际控制总面积约为959.67万平方千米[3](实际管辖区域),仅次于俄罗斯、加拿大而居世界第三;陆地总面积(不計河、湖)约932.64万平方千米,仅次于俄罗斯而列世界第二[6];中华人民共和国将行政區劃分为23个省、5个少数民族自治区、4个直辖市、以及2个特别行政区,但台湾不在中华人民共和国政府实际控制范围内(参见:台湾问题)。中华人民共和国是世界上人口最多的国家,人口总数超過13亿,佔全球人口的五分之一。境内民族众多,获得官方认可的民族有56个,其中汉族人口占绝大多数,其余55个民族被统称为少数民族。中华人民共和国境内的通用语言是汉语普通话,使用的文字是规范汉字(此即汉语簡化字),少数民族如壮族、维吾尔族、蒙古族、藏族、朝鲜族等拥有自己的文字。《中华人民共和国宪法》规定公民有宗教信仰自由,大部分公民无固定宗教信仰,部分人信仰佛教、道教、基督教和伊斯兰教等宗教。中华人民共和国共跨越五个时区,但全国皆使用單一的北京时间(东经120度)为标准时间。
《中华人民共和国宪法》规定中华人民共和国是工人阶级领导的、以工农联盟为基础的人民民主专政的社会主义国家;
搜索出来的:
中华人民<font color='red'>共和国</font>(英文:The People's Republic of China,通常简称为中国(英文:China)[5],
位於亚洲东部、太平洋西岸,陆上从东北至西南分别与朝鲜
只能匹配到一行
使用paoding的话,却可以匹配到多处。
分享到:
相关推荐
IKAnalyzer3.2在设计时考虑了中文语言的特性,如词语的多音字、歧义和无空格分隔等问题,采用了智能切词算法,提高了对中文词汇的识别精度。同时,IKAnalyzer还支持用户自定义词典,允许根据具体业务需求扩展或调整...
IKAnalyzer是一款基于Java语言开发的全文检索分析器,主要用于对中文文本进行高效的分词处理。在标题中的"IKAnalyzer3.2.5Stable...通过持续的优化和改进,IKAnalyzer在处理中文分词问题上展现出了强大的性能和灵活性。
年 12 月推出 1.0 版开始, IKAnalyzer 已经推出了 3 个大版本。最初,它是以开源项目 Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的 IK Analyzer 3.X 则发展为面向 Java 的公用分词...
IkAnalyzer3.2的jar包 IK Analyzer 是一个开源的,基于java 语言开发的轻量级的中文分词工具包。从2006 年12 月推出1.0 版开始, IKAnalyzer 已经推出了3 个大版本。最初,它是以开源项目 Luence 为应用主体的,结合...
本话题主要探讨的是在Java 1.5环境下,如何利用Lucene 3.0.1版本和IKAnalyzer 3.2来实现模糊查询的功能。Lucene是一个高性能、全文本搜索库,而IKAnalyzer是一个专门针对中文分词的开源分析器,它们的结合能够有效地...
**IKAnalyzer中文分词器V3.2使用详解** IKAnalyzer是一款开源的、适用于Java环境的中文分词器,主要用于解决在信息检索、文本挖掘等领域中遇到的中文处理问题。这款分词器的设计目标是提高分词的准确率,并且具有...
1. 《IKAnalyzer中文分词器V3.X使用手册》 2. IKAnalyzer3.X.jar(主jar包) 3. IKAnalyzer.cfg.xml(分词器扩展配置文件) 4. ext_stopword.dic(扩展的stopword词典,3.2以上版本提供) 它的安装部署十分简单,...
在MyEclipse集成开发环境中导入IKAnalyzer3.2版本,可以方便地进行开发和测试工作。 一、IKAnalyzer的核心功能和特点: 1. **词典驱动**:IKAnalyzer依赖于丰富的词典资源,包括基础词典、扩展词典等,确保了对常见...
在标题“IKAnalyzer3.2 分词技术”中,"IKAnalyzer3.2"指的是该分词器的一个特定版本,它可能包含了一些性能优化和新特性。"分词技术"则是指通过特定算法将连续的汉字序列拆分成具有实际意义的词汇单元,这是自然...
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词...
### IKAnalyzer中文分词器V2012使用手册知识点详解 #### 1. IKAnalyzer2012介绍 IKAnalyzer是一款开源的、基于Java语言开发的轻量级中文分词工具包。自2006年12月发布1.0版以来,已历经多次迭代,至2012版本时,它...
#### 一、IKAnalyzer3.2.8系统架构 IKAnalyzer3.2.8是一款基于Java语言编写的开源分词组件,广泛应用于搜索引擎、文本处理等领域。它能够高效地对中文文本进行分词处理,并支持自定义词典扩展等功能。本文档旨在...
用户可以执行install_IKAnalyzer.bat批处理文件来安装IKAnalyzer。如果批处理文件执行失败,可以手动注册或使用命令mvn install:install-file来安装IKAnalyzer。 3.2 手动更新Maven项目 在导入源码到Eclipse后,...
- 修改schema.xml文件,添加自定义的域类型FieldType,并指定IKAnalyzer作为分词器。 - 重启Tomcat后,配置业务域成功。 ### 3. Java中SolrJ的使用 SolrJ是Solr官方提供的Java客户端库,用于操作Solr服务。 #### ...
"analyzer": "ik_max_word" } }, "mappings": { "properties": { "text": { "type": "text", "analyzer": "ik_max_word" } } } } ``` 这样,"text"字段的中文内容将使用IK插件进行分词。 3.2 查询优化 ...
- 从GitHub或者其他渠道下载IKAnalyzer分词器的jar包和配置文件。 - 将下载的jar包放入Solr的lib目录中。 - 复制配置文件到Solr的核心集合中。 ##### 3.2 配置IK分词器 1. **修改schema.xml**: - 在Solr的核心...
### 3.2 配置IK分词器 在`config/elasticsearch.yml`中添加以下配置,以启用IK分词器: ```yaml index.analysis.analyzer.default.type: "ik_max_word" ``` 或者,如果你想自定义分词规则,可以创建一个名为`ik....
可以使用开源的中文分词库如HanLP、IK Analyzer或自定义分词算法对文本进行处理。 1.3 索引构建:索引是搜索引擎快速检索的基础,可采用倒排索引结构。ASP.NET可以使用内存数据库(如Redis)或文件系统(如Lucene...
- **全文搜索**:Hibernate Search 4.2 (Apache Lucene 3.6)、IKAnalyzer 2012_u6 - **日志管理**:Log4j 1.2 这些技术的选择不仅体现了JeeSite对于稳定性和性能的追求,也反映了其对于开发便捷性和社区支持的关注...