public void createIndex(Article article) throws Exception {
// 实例化分词器,使用的是中文分词器
Analyzer analyzer = new IKAnalyzer();
// 指定要保存的文件路径并保存到FSDirectory中
FSDirectory directory = FSDirectory.open(new File(URLDecoder.decode(
AnalyzerAction.class.getResource("/date/index/article/")
.toString(), "UTF-8").substring(6)));
// true表示覆盖原来已经创建的索引,如果是false表示不覆盖,而是继续添加索引
IndexWriter writer = new IndexWriter(directory, analyzer, false,
IndexWriter.MaxFieldLength.UNLIMITED);
Document doc = new Document();
doc.add(new Field("id", String.valueOf(article.getId()),
Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("article_title", article.getArticleTitle(),
Field.Store.YES, Field.Index.ANALYZED));
String content = FunctionUtil.Html2Text(article.getArticleContent());
doc.add(new Field("article_content", content, Field.Store.YES,
Field.Index.ANALYZED));
writer.addDocument(doc);
writer.optimize();
writer.close();
}
/**
* 通过关键词 得到结果
*/
public void searchIndex(String path, String keywords) throws Exception {
FSDirectory directory = FSDirectory.open(new File(path));
IndexReader reader = IndexReader.open(directory);
Searcher searcher = new IndexSearcher(directory);
// MultiFieldQueryParser.parse中的参数分别为:
// 1.关键词
// 2.要查询的字段,字符串类型的数组
String[] field = { "article_title", "article_content" };
// 3.两个字段的关系(与或非)
BooleanClause.Occur[] flags = new BooleanClause.Occur[] {
BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD };
// 4.指明分词的时候所用的分词器
Analyzer analyzer = new IKAnalyzer();
// Query query = MultiFieldQueryParser.parse(keywords, field, flags,
// analyzer);
Query query = MultiFieldQueryParser.parse(Version.LUCENE_30, keywords,
field, flags, analyzer);
// 由于我们目前使用的查询是多字段查询,需要匹配度的排序
// QueryScorer内置计分器
query.rewrite(reader);// 用于重写query对象,目的能够让计分器识别当前的query.
// 获得结果集
// Hits hits = searcher.search(query);
TopDocs hits = searcher.search(query,20000);
this.maxResultSize = String.valueOf(hits.scoreDocs.length);
for (int i = 0; i < hits.scoreDocs.length; i++) {
ScoreDoc sdoc = hits.scoreDocs[i];
Document doc = searcher.doc(sdoc.doc);
Article article = new Article();
article.setId(Integer.valueOf(doc.get("id")));
// title
String title = doc.get("article_title");
// content
String content = doc.get("article_content");
// 以上两项需要加亮
// Highlighter的构造函数中需要添加两个参数
// 1.高亮文字的格式(这个格式是基于html)
SimpleHTMLFormatter simpleHTMLFOrmatter = new SimpleHTMLFormatter(
"<font color=red>", "</font>");
// 2.计分器
Highlighter highlighter = new Highlighter(simpleHTMLFOrmatter,
new QueryScorer(query));
// 关键字附近字符串的截取,截取120个字
Fragmenter fragmenter = new SimpleFragmenter(120);
highlighter.setTextFragmenter(fragmenter);
// 针对某个字段的加亮以及截取
TokenStream tokenStream = analyzer.tokenStream("article_content",
new StringReader(content));
// 将加亮并截取的字符串取出来
String highLightText = highlighter.getBestFragment(tokenStream,
content);
article.setArticleContent(highLightText);
// 针对某个字段的加亮以及截取
TokenStream title_tokenStream = analyzer.tokenStream(
"article_title", new StringReader(title));
// 将加亮并截取的字符串取出来
String title_highLightText = highlighter.getBestFragment(
title_tokenStream, title);
article.setArticleTitle(title_highLightText);
searcheResult.add(article);
}
reader.close();
}
改动的地方不是很多,注意看一下
分享到:
相关推荐
本文将深入探讨基于Lucene的四种中文分词器:Paoding、IK、Imdict和Mmseg4j,它们都是针对Java开发的高效、开源的中文分词工具。 1. Paoding(庖丁)分词器: Paoding是一款高性能的中文分词器,设计目标是提供...
能兼容solr-4.10.2的分词器,大礼包...包括IK分词器,mmseg4j分词器,庖丁分词器.都是经本人测试可用,其中mmseg4j与庖丁都是下载源码,修改重编译并测试生成的.希望大家喜欢.至于与solr的整合方式,网上很多,这里就不介绍了.
1. 分词器性能优化:根据实际应用场景选择合适的分词器,如对新词识别要求高可选用IK Analyzer,对专业领域词汇处理则考虑Paoding Analyzer。 2. 词典定制:针对特定领域,可以自定义词典以提高分词准确性,例如增加...
Lucene采用3.03版,太新版和 ik paoding不兼容。 ----------------------------------------- 极易分词只支持1.9-2.4版,未测试 IKAnalyzer分词 2012版不支持,采用3.2.8版 在使用2012版时异常:...
3,分享一波分词器SDK开发包及使用手册(IK分词器、imdict(ictclas)分词器、je分词器、mmseg分词器、paoding分词器、Shuzhen分词器、庖丁解羊分词器、增强版lucene分词器) 文件比较大,请耐心下载。
它使用了 HanLP、IK Analyzer 或者 Paoding 分词器等工具,以适应中文的语法特点,提高搜索精度。 4. **lucene-queryparser-4.7.0.jar**:这个包包含了 Lucene 的查询解析器,可以将用户的查询字符串转换为内部表示...
- **SimpleAnalyzer**:也是英文分词器,会忽略一些常见的英文停用词。 - **StopAnalyzer**:同样适用于英文,可以排除停用词。 - **StandardAnalyzer**:可用于中文分词,采用简单的二分法,即将每个汉字视为一个词...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...