分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
这个在我的搜索引擎里用的就是这个。
- package com.laozizhu.search.demo;
- import net.paoding.analysis.analyzer.PaodingAnalyzer;
- import org.apache.lucene.analysis.Analyzer;
- import org.apache.lucene.document.Document;
- import org.apache.lucene.queryParser.MultiFieldQueryParser;
- import org.apache.lucene.search.BooleanClause;
- import org.apache.lucene.search.IndexSearcher;
- import org.apache.lucene.search.Query;
- import org.apache.lucene.search.ScoreDoc;
- import org.apache.lucene.search.TopDocCollector;
- import org.apache.lucene.search.highlight.Highlighter;
- import org.apache.lucene.search.highlight.QueryScorer;
- import org.apache.lucene.search.highlight.SimpleFragmenter;
- import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
- /**
- * Lucene 2.4 + Highlighter 2.4 的分页+高亮显示代码例子.<br>
- * 高亮的css自己写吧。
- *
- * @author 老紫竹研究室(laozizhu.com)
- */
- public class TestLuceneHighlighter {
- private static final String FIELD_TITLE = "title";
- private static final String FIELD_BODY = "body";
- public synchronized Analyzer getAnalyzer() {
- return new PaodingAnalyzer();
- }
- public void test(String queryString, int begin, int number) {
- IndexSearcher isearcher = null;
- try {
- isearcher = new IndexSearcher("d:/index");
- /* 下面这个表示要同时搜索这两个域,而且只要一个域里面有满足我们搜索的内容就行 */
- BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD };
- TopDocCollector collector = new TopDocCollector(10);
- Query query = MultiFieldQueryParser.parse(queryString, new String[] { FIELD_TITLE, FIELD_BODY }, clauses, getAnalyzer());
- isearcher.search(query, collector);
- ScoreDoc[] hits = collector.topDocs().scoreDocs;
- // 用这个进行高亮显示,默认是<b>..</b>
- // 用这个指定<read>..</read>
- SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<read>", "</read>");
- // 构造高亮
- // 指定高亮的格式
- // 指定查询评分
- Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query));
- // 这个一般等于你要返回的,高亮的数据长度
- // 如果太小,则只有数据的开始部分被解析并高亮,且返回的数据也少
- // 太大,有时太浪费了。
- highlighter.setTextFragmenter(new SimpleFragmenter(Integer.MAX_VALUE));
- for (int i = begin; i < hits.length && i < begin + number; i++) {
- Document doc = isearcher.doc(hits[i].doc);
- // 有三个参数
- // 分析器
- // 要解析的字段名
- // 要解析的数据
- System.out.println(highlighter.getBestFragment(getAnalyzer(), FIELD_TITLE, doc.get(FIELD_TITLE)));
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (isearcher != null) {
- try {
- isearcher.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }