`
longzhun
  • 浏览: 360219 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

lucene3+IK分词器 改造 lucene2.x+paoding

 
阅读更多
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();
	}

 

改动的地方不是很多,注意看一下

分享到:
评论
1 楼 dandongsoft 2013-03-08  
    

相关推荐

    基于Lucene的中文分词器代码paoding,IK,imdict,mmseg4j

    基于Lucene的中文分词器代码paoding,IK,imdict,mmseg4j。测试可运行,输入一个段落,每个分词器的分词结果不同,可得到结果和所需时间。

    兼容solr4.10.2的ik-mmseg4j-paoding分词器

    能兼容solr-4.10.2的分词器,大礼包...包括IK分词器,mmseg4j分词器,庖丁分词器.都是经本人测试可用,其中mmseg4j与庖丁都是下载源码,修改重编译并测试生成的.希望大家喜欢.至于与solr的整合方式,网上很多,这里就不介绍了.

    Lucene使用

    Lucene采用3.03版,太新版和 ik paoding不兼容。 ----------------------------------------- 极易分词只支持1.9-2.4版,未测试 IKAnalyzer分词 2012版不支持,采用3.2.8版 在使用2012版时异常:...

    全文检索之分词器分享.zip

    3,分享一波分词器SDK开发包及使用手册(IK分词器、imdict(ictclas)分词器、je分词器、mmseg分词器、paoding分词器、Shuzhen分词器、庖丁解羊分词器、增强版lucene分词器) 文件比较大,请耐心下载。

    java开源包2

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包3

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包10

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包101

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包1

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包11

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包6

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包5

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包4

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包8

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包7

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包9

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    Java资源包01

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

Global site tag (gtag.js) - Google Analytics