java的搜索引擎之Lucene的创建和搜索高亮
package cn.mmclbs.com;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.Reader;import java.io.StringReader;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.document.Field.Index;import org.apache.lucene.document.Field.Store;import org.apache.lucene.search.Query;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;/** * 转换工具类 * @author Administrator * */public class DocumentAndStringUtil{/** * String转换Document * @param file 返回的文件 * @return * @throws Exception */public static Document getString2Docuement(File file) throws Exception{Document doc = new Document();doc.add(new Field("name",file.getName(),Store.YES,Index.ANALYZED));doc.add(new Field("content",readFile(file),Store.YES,Index.ANALYZED));doc.add(new Field("size",String.valueOf(file.length()),Store.YES,Index.NOT_ANALYZED));doc.add(new Field("url",file.getAbsolutePath(),Store.YES,Index.NO));return doc;}/** * 读取File文件转换成String * @param file 文件对象 * @return * @throws Exception */private static String readFile(File file) throws Exception{InputStream inStream = new FileInputStream(file);Reader reader = new InputStreamReader(inStream); BufferedReader br = new BufferedReader(reader);StringBuffer buffer = new StringBuffer();String tempStr = null;while((tempStr = br.readLine()) != null){buffer.append(tempStr+"\n");}return buffer.toString();}/** * Document转换成String * @param doc 对象 * @param analyzer 分词器 * @param query 查询对象 * @return * @throws Exception */public static void getDocumentoString(Document doc, Analyzer analyzer,Query query) throws Exception{System.out.println("名称:"+doc.get("name"));System.out.println("内容:"+getHighLight(doc,analyzer,query,"content"));System.out.println("大小:"+doc.get("size"));System.out.println("地址:"+doc.get("url"));}/** * 高亮 * @param doc 对象 * @param analyzer 分词器 * @param query 查询对象 * @param field 查询的内容 * @return * @throws Exception */public static String getHighLight(Document doc, Analyzer analyzer, Query query, String field) throws Exception{SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<b>", "</b>");/* 语法高亮显示设置 */Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query));highlighter.setTextFragmenter(new SimpleFragmenter(100));// 取 field 字段值,准备进行高亮String fieldValue = doc.get(field);TokenStream tokenStream = analyzer.tokenStream(field, new StringReader(fieldValue));// 转成高亮的值String highLightFieldValue = highlighter.getBestFragment(tokenStream, fieldValue);if (highLightFieldValue == null)highLightFieldValue = fieldValue;return highLightFieldValue;}}?
?