1、结果高亮

Lucene对高亮显示提供 了两种实现模式,Highlighter和FastVectorHighlighter。FastVectorHighlighter速度快,功能更完美。但其是有一定条件的,在使用FastVectorHighlighter创建索引时,需要存储Field分词信息(TermVector.WITH_POSITIONS_OFFSETS),而Highlighter是不需要这个前提条件的。

高亮显示处理流程图:

处理流程.png

(1)、获取原始文档,需在生成索引时设置Store.YES属性,且若在索引域中指定TermVector.WITH_POSITIONS_OFFSETS属性,则能大大加速获取过程。同时lucene提供TokenSources类,若创建索引时已存在Store.YES信息,则可以直接获取到文档的TokenStream信息;若不存在,则需要通过Analyzer去获取实现。

(2)、利用Fragmenter对文档信息进行切分处理。这个过程也非常重要,因为通过Fragmenter处理,可将原文档中冗余的信息过滤,从而选择需要的内容,进行后续的操作。

(3)、Lucene提供QueryScorer和SpanScorer类来对每一个切片进行评分,以便选出最符合搜索条件的文档内容。

(4)、将最后选定的文档内容进行编码处理。

(5)、对编码后的文档进行格式化处理,包括加粗、改变现实字体颜色等。

(6)、对修改完成的内容进行编译,就能完成高亮显示文本输出。

高亮显示代码示例:

public class HighlighterSearcher {public static void search(String indexDir, String q) throws IOException, ParseException {// 得到读取索引文件的路径Directory dir = FSDirectory.open(Paths.get(indexDir));// 通过Dir得到路径下所有文件IndexReader reader = DirectoryReader.open(dir);// 建立索引查询器IndexSearcher searcher = new IndexSearcher(reader);// 实例化分析器Analyzer analyzer = new StandardAnalyzer();/********建立查询解析器********/// 第一个参数是要查询的字段; 第二个参数市分析器AnalyzerTermQuery query = new TermQuery(new Term("name", q));Scorer scorer = new QueryScorer(query);SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<span class=\"highlight\">", "</span>");Highlighter high = new Highlighter(formatter, scorer);long start = System.currentTimeMillis();/********开始查询********/// 第一个参数是通过传过来的参数来查找得到的query; 第二个参数是要查询出的行数TopDocs hits = searcher.search(query, 10);// 计算索引结束时间long end = System.currentTimeMillis();System.out.println("匹配 " + q + ",查询到 " + hits.totalHits + " 个记录, 用时:" + (end - start));// 遍历hits.scoreDocs,得到scoreDoc// scoreDoc:得分文档,即得到的文档  scoreDocs:代表topDocs这个文档数组for (ScoreDoc scoreDoc : hits.scoreDocs) {Document doc = searcher.doc(scoreDoc.doc);try {TokenStream tokenStream = new CJKAnalyzer().tokenStream("name", new StringReader(doc.get("name")));System.out.println(high.getBestFragment(tokenStream, doc.get("name")));} catch (Exception e) {e.printStackTrace();}}//关闭readerreader.close();}
}

输出结果示例:

匹配 lucene,查询到 8 hits 个记录, 用时:56
<span class="highlight">Lucene</span>
<span class="highlight">Lucene</span> 实战(第2版).pdf
《从<span class="highlight">Lucene</span>到Elasticsearch 全文检索实战》.pdf
《从<span class="highlight">Lucene</span>到Elasticsearch 全文检索实战》.pdf
<span class="highlight">Lucene</span>搜索引擎开发权威经典.pdf
从<span class="highlight">Lucene</span>到Elasticsearch:全文检索实战@www.java1234.com.pdf
<span class="highlight">Lucene</span>搜索引擎开发进阶实战www.java1234.com.pdf
解密搜索引擎技术实战  <span class="highlight">LUCENE</span> &amp; JAVA精华版  第3版@www.java1234.com.pdf

2、词频统计

词频统计(TF),就是在一个给定的文本、文档或者词库中,给定的一个关键词在该文本、文档或者词库中出现的次数。词频统计,就是针对这些关键词出现的次数,按照不同的统计方法,进行一个有效的统计。

2.1、域值排序

域值排序即为按照权重排序,权重值越大,其匹配程度越高,排序就靠前。域值排序需要使用search(Query,Filter,Sort)方法,若排序后不需要过滤结果,可将Filter设置为null。通常,接受Sort对象参数的Search方法不会对匹配文档进行评分,因此在实现search的过程中,综合考虑通过域值排序无需就行评分操作。而且评分操作会造成系统性能大量损耗。

2.2、索引顺序排序

如果需要实现索引顺序排序,可以借助searcher方法中的Sort.INDEXORDER作为参数来实现。对于按照索引顺序排序的搜索结果,文档顺序一旦建立就不会改变了,如果重新更新索引文档,之前的索引就失效了,新的文档会生成新的id,然后重新排序。所以,在实际的程序应用中,这种操作的可行性不高,意义不大,因此也很少被采用。在程序开发中若没有选择任何排序方式,则Lucene会根据文档的评分来完成排序工作,其实评分排序是Lucene默认的排序方式。

2.3、相关性排序

按照相关程度对结果进行的降序排列,也可称为默认评分排序。即按照关键字与搜索的内容匹配或意思符合程度高低进行排序。当然,相关性排序也可以按照升序排序,但是应用不多,因此很少被提及。相关性排序是通过将 Sort 对象参数设为 null ,然后传递给相关方法或者使用默认排序方法来实现的。每种调用方法都会返回默认评分的排序结果。由于我们在使用 Sort 对象时会产生额外的开销,所以要尽可能地使用 search ( Query , int )方法来达到排序的目的。

2.4、词频率排序

根据词出现的频率进行排序,有点类似域值排序,需要引入计数来根据关键词(字)在被搜索内容(句子、文本或文章)中出现的频率(次数)进行统计,然后根据统计出来的重复率按由高到低的顺序来进行排序,这时就关联上了相关性排序,更多与关键字相关的内容排在了最前面。因此,根据词频率的排序,就像是综合了域排序和相关性排序的方法,对关键字搜索结果进行优化后显示出来的。

搜索引擎Lucene(6):查询结果高亮及词频提取相关推荐

  1. 搜索引擎lucene

    引用:http://baike.baidu.com/view/371811.htm Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它 ...

  2. 搜索引擎lucene点滴

    搜索引擎lucene点滴 在项目中有用到搜索引擎lucene.现将学到的lucene中的一些知识点和用法的做了下总结,希望能够对大家有所帮助. 本项目中的lucene使用概述:在Portal项目中lu ...

  3. 5分钟了解搜索引擎Lucene的原理

    场景 假设现在有10W+份word文档,让你做个web页面,给出关键词能快速搜索结果,你会怎么做?那至少有3种方案, 顺序扫描,每次检测文档中是否包含关键词,包含则加入结果列表,不包含继续查找下一个, ...

  4. 一个例子学懂搜索引擎(lucene)

    http://www.vifir.com/html/20080827/1703937.html 一个例子学懂搜索引擎(lucene) 来源:javaeye 作者: phz50 2008-08-27 1 ...

  5. Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser

    一.Lucene的查询语法 Lucene所支持的查询语法可见http://lucene.apache.org/java/3_0_1/queryparsersyntax.html (1) 语法关键字 + ...

  6. lucene Term查询

    查询demo Path path = Paths.get(util.Directory.GetAppPath("indexDir"));IndexReader reader = D ...

  7. mapbox 添加geojson图层实现属性查询、高亮、地图手势变化等功能

    <!DOCTYPE html> <html><head><meta charset="utf-8" /><title>m ...

  8. 阿里P8架构师谈:开源搜索引擎Lucene、Solr、Sphinx等优劣势比较

    开源搜索引擎分类 1.Lucene系搜索引擎,java开发,包括: Lucene Solr Elasticsearch Katta.Compass等都是基于Lucene封装. 你可以想象Lucene系 ...

  9. 主流搜索引擎Lucene,Solr,ElasticSearch

    Lucene Lucene是一个Java全文搜索引擎,完全用Java编写.Lucene不是一个完整的应用程序,而是一个代码库和API,可以很容易地用于向应用程序添加搜索功能. 可扩展的高性能索引 在现 ...

最新文章

  1. Python_note4 程序控制结构+random库的使用
  2. 数据列过滤条件常用处理
  3. mysql 十八哥_十八哥Mysql笔记之基础篇
  4. CentOS 7 + nginx-1.12 + php-7.2 + MySQL-5.7
  5. 每日一笑 | 哪个男人到底是谁?!
  6. python之路_前端基础之Bootstrap 组件
  7. mysql union 与 union all 语法及用法
  8. PHP字符编码问题之GB2312 VS UTF-8
  9. [数学][欧拉降幂定理]Exponial
  10. Android加上base的作用,android-notifyDataSetChanged在BaseAdapter上不起作用
  11. 微型计算机控制课程设计,《微型计算机控制技术》课程设计
  12. POJ NOI0105-41 数字统计
  13. 第二阶段团队站立会议08
  14. 微信小程序——云开发入门
  15. 迅雷没有做错什么,只是用户不需要了
  16. stm32 代码加密
  17. html发短信模版,短信模板管理.html
  18. 无损检测服务行业调研报告 - 市场现状分析与发展前景预测
  19. 【渝粤题库】广东开放大学 金融经济学 形成性考核
  20. 比特大陆的“新筹码”:IPO失效后,押注算力芯片

热门文章

  1. 数字 IC 笔试面试必考点(3)数字 IC 前端设计 + 后端实现
  2. 坦然地接受你所面对的每一个人
  3. Sentinel系列4--- 实战限流篇
  4. /WEN-INF/jsp文件夹下文件不能直接访问--20180209第一篇
  5. MaxCompute导入数据
  6. 我在字节跳动的收获总结-产品规划、PRD编辑及复盘
  7. 微信小程序创建透明遮罩
  8. 在线考试教学系统平台系统源码/视频教学系统PHP源码/在线考试系统PHP源码
  9. 30分钟入门达梦数据库
  10. 灵飞经4·西城八部 第十九章 片山微雨(二)