前言
我们在使用百度和谷歌等搜索引擎的时候,你会发现,搜索引擎会把和我们输入的关键字以红色的字体显示,来突出显示结果的准确性,这就是高亮显示的使用场景
准备
使用Highlighter需要导入相应的jar包,maven项目可以加入如下依赖
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>5.5.0</version>
</dependency>
直接看代码
/** * @author kl by 2016/3/19 * @boke www.kailing.pub */ public class FieldSetBoostTest { //索引目录 String indexDir="E:\\LuceneIndex"; //测试数据 String theme="中国"; String []title={"中国是一个伟大的国家","我爱你的的祖国,美丽的中国","是什么,中国令美日等国虎视眈眈"}; /** * Lucence5.5返回IndexWriter实例 * @param directory * @return */ public IndexWriter getIndexWriter(Directory directory){ Analyzer analyzer=new CJKAnalyzer();//中日韩二元分词 IndexWriterConfig writerConfig=new IndexWriterConfig(analyzer); IndexWriter writer=null; try { writer =new IndexWriter(directory,writerConfig); }catch (Exception e){ e.printStackTrace(); } return writer; } public Directory getDirctory(String indexDir){ Directory directory=null; try { directory=FSDirectory.open(Paths.get(indexDir)); }catch (IOException e){ e.printStackTrace(); } return directory; } /** * 创建索引不加权 * @throws Exception */ public void Indexer()throws Exception{ IndexWriter writer=getIndexWriter(getDirctory(indexDir)); Document doc=null; for(String str:title){ doc=new Document(); //Lucence5.5 Fileld有多个实现,StringFIeld不分词 TextField分词 doc.add(new StringField("theme",theme, Field.Store.YES)); Field field=new TextField("title",str, Field.Store.YES); doc.add(field); writer.addDocument(doc); } writer.close(); } /** * 关键命中词高亮输出处理 * @param query * @param context * @return * @throws Exception */ public static String getHighlighterString(Query query,String context)throws Exception{ //对促成文档匹配的实际项进行评分 QueryScorer scorer=new QueryScorer(query); //设置高亮的HTML标签格式 Formatter simpleHTMLFormatter=new SimpleHTMLFormatter("",""); //实例化高亮分析器 Highlighter highlighter=new Highlighter(simpleHTMLFormatter,scorer); //提供静态方法,支持从数据源中获取TokenStream,进行token处理 TokenStream tokenStream=new CJKAnalyzer().tokenStream("title", new StringReader(context)); return highlighter.getBestFragment(tokenStream, context); } @Test public void searcherTest()throws Exception{ // Indexer(); IndexReader reader= DirectoryReader.open(getDirctory(indexDir)); IndexSearcher is=new IndexSearcher(reader); System.out.println("总的文档数:"+reader.numDocs()); QueryParser qp=new QueryParser("title",new CJKAnalyzer()); String q="中国"; Query query=qp.parse(q); TopDocs tDocs=is.search(query,11); System.out.println("查询-》"+q+"《-总共命中【"+tDocs.totalHits+"】条结果"); for (ScoreDoc scoredoc:tDocs.scoreDocs){ Document doc = is.doc(scoredoc.doc); String context=doc.get("title"); if(context!=null){ System.out.println(getHighlighterString(query,context)); } } } }
查询效果如下: