最近一直在做lucene搜索模块,遇到搜索慢,网上收集一些关于优化的文章总结如下:

1、对于按创建时间的排序可以使用doc.id的方式
      new SortField(null, SortField.DOC, reverse)排序方式尽量使用INT类型的字段
     也就是按照写入索引的顺序排序
2、对于时间字符串的排序可以转换成整数进行排序
3、去掉不必要的parse
    使用TermQuery替换

(注意:前提是该字段在建索引的时候采用不分词方式,如果在建索引时是分词方式,则会导致检索不到任何结果的问题)
4、TermQuery和Term可以只保留一个实例
      createTerm(text)

(适用于对一个字段进行多关键词搜索的情况)
5、减少Doc到model的转换
     索引出来String到Date的转换多余而且费时
     直接使用Doc对象包装成JSONObject
6、MultiFieldQueryParser改成自己用boolean查询重构
7、减少请求参数的包装类
8、搜索排序方法可以作为常量
     将sort参数变成int型,使用swich进行判断
10、使用HitCollector类来适应不同情况下,Hits的大小
       新、旧接口
       相关搜索接口

(如果项目中需要进行分组统计,实现HitCollector类就可以做到)
11、使用尽可能快的磁盘IO
12、日志,先写文件,每天批量入库
13、增量索引使用reopen
       新的reopen()方法只会加载那些变更过的索引片断,而不是重新加载完整的索引。

(这在见面的日志里已有介绍,主要是尽量使用一个IndexSearcher实例)
14、setMergeFactor 在做实时索引的时候,可以设置的小一点
       这样就会及时索引进去

高亮显示优化:
   1 、问题的来源
  
  增加分词以后结果的准确度提高了,但是用户反映返回结果的速度很慢。原因是, Lucene 做每一篇文档的相关关键词的高亮显示时,在运行时执行了很多遍的分词操作。这样降低了性能。
  
  2 、解决方法
  
  在 Lucene1.4.3 版本中的一个新功能可以解决这个问题。 Term Vector 现在支持保存 Token.getPositionIncrement() 和 Token.startOffset() 以及 Token.endOffset() 信息。利用 Lucene 中新增加的 Token 信息的保存结果以后,就不需要为了高亮显示而在运行时解析每篇文档。通过 Field 方法控制是否保存该信息。修改 HighlighterTest.java 的代码如下:
  
  // 增加文档时保存 Term 位置信息。
  
  private void addDoc(IndexWriter writer, String text) throws IOException
  
  {
  
  Document d = new Document();
  
  //Field f = new Field(FIELD_NAME, text, true, true, true);
  
  Field f = new Field(FIELD_NAME, text ,
  
  Field.Store.YES, Field.Index.TOKENIZED,
  
  Field.TermVector.WITH_POSITIONS_OFFSETS);
  
  d.add(f);
  
  writer.addDocument(d);
  
  }
  
  // 利用 Term 位置信息节省 Highlight 时间。
  
  void doStandardHighlights() throws Exception
  
  {
  
  Highlighter highlighter =new Highlighter(this,new QueryScorer(query));
  
  highlighter.setTextFragmenter(new SimpleFragmenter(20));
  
  for (int i = 0; i < hits.length(); i++)
  
  {
  
  String text = hits.doc(i).get(FIELD_NAME);
  
  int maxNumFragmentsRequired = 2;
  
  String fragmentSeparator = "...";
  
  TermPositionVector tpv = (TermPositionVector)reader.getTermFreqVector(hits.id(i),FIELD_NAME);
  
  // 如果没有 stop words 去除还可以改成 TokenSources.getTokenStream(tpv,true); 进一步提速。
  
  TokenStream tokenStream=TokenSources.getTokenStream(tpv);
  
  //analyzer.tokenStream(FIELD_NAME,new StringReader(text));
  
  String result =
  
  highlighter.getBestFragments(
  
  tokenStream,
  
  text,
  
  maxNumFragmentsRequired,
  
  fragmentSeparator);
  
  System.out.println("/t" + result);
  
  }
  
  }
  
  最后把 highlight 包中的一个额外的判断去掉。对于中文来说没有明显的单词界限,所以下面这个判断是错误的:
  
  tokenGroup.isDistinct(token)
  
  这样中文分词就不会影响到查询速度了。

(本人也在项目中尝试了,可是发现总报NullPointerException错误,但看到paoding分词作者qieqie在给定的例子里也是采用优化后的方法来高亮显示,运行它的例子也没有问题,不知是不是我的项目里缩小搜索结果集,限制最大搜索1000条记录的原因导致,至今未解)

lucene搜索优化相关推荐

  1. vc++调用jni_通过JNI使用C ++尖叫快速进行Lucene搜索

    vc++调用jni 最终,当Lucene执行查询时,在初始设置后,真正的热点通常是相当基本的代码,该代码对整数docID,术语频率和位置的顺序块进行解码,并将它们匹配(例如,对BooleanQuery ...

  2. 通过JNI使用C ++尖叫快速进行Lucene搜索

    一天结束时,Lucene执行查询时,在初始设置后,真正的热点通常是相当基本的代码,它解码整数docID,术语频率和位置的顺序块,并对其进行匹配(例如,对BooleanQuery并集或交集),则为每个匹 ...

  3. vue 同一个域名移动端pc端两套代码跳转_百度移动搜索优化:手机站优化指南

    百度移动搜索是全球最大的中文手机搜索引擎,每天用户使用百度移动搜索发起的搜索请求高达数亿次.本文档旨在为手机站站长提供官方.明确的搜索引擎优化标准,使站长合理.可持续的提升手机站流量,获得长久.稳定的 ...

  4. 帝国cms7.5百度小程序针对搜索引擎自然搜索优化版生成静态版

    最新更新 2020-04-02 18:45:00 相关搜索优化功能 第一.接入自然搜索,小程序新资源提交,自动同步提交/swan-sitemap/index 第二.修正小程序页面地址url,则原来的n ...

  5. 使用 Apache Lucene 搜索文本——轻松为应用程序构建搜索和索引功能

    简介: 本文将探讨 Apache Lucene -- 性能卓越.功能全面的文本搜索引擎库.我们将学习 Lucene 架构及其核心 API.学习如何使用 Lucene 进行跨平台全文本搜索.建立索引.显 ...

  6. Lucene学习总结之七:Lucene搜索过程解析

    一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: ...

  7. lucene 搜索_使用Lucene的搜索服务器搜索Jira问题

    lucene 搜索 您可能还记得我的第一篇博客文章 ,该文章描述了Lucene开发人员如何使用Lucene搜索应用程序查找我们的Jira问题来食用我们自己的狗粮. 该应用程序已成为许多现代Lucene ...

  8. outlook搜索栏跑到上面去了_长春企业网站搜索优化如何做

    如何做企业l31b10网站搜索优化长春,SEO排名,它是指搜索引擎优化关键词排名.而影响到seo排名的因素有很多,比如说域名注册的时间,服务器的空间速度和稳定性,或者像是网站整体的结构,网站的内容等等 ...

  9. 微信全文搜索优化之路

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者: jiaminchen,微信终端开发团队的一员 本文首次发表在<程序员>杂志 2017 年 09 月期. 前言 基于本地 ...

最新文章

  1. JEECMS8——系列文档
  2. ftp服务器搭建(离线安装vsftpd),配置
  3. 如何阅读AI顶会论文,搭建深度学习知识体系框架?
  4. IDEA中创建类时,自动在文件头中添加作者以及创建时间
  5. C语言满分代码:L1-050 倒数第N个字符串 (15分)
  6. iTerm2 快捷键
  7. java gui 按键 数组_java GUI分配数组值
  8. js去el的map_JS中也可以使用JSTL和EL标签
  9. idea新建xml文件
  10. mac maven安装位置_Maven的安装以及仓库的作用
  11. 三类MySQL_Mysql中的三类锁,你知道吗?
  12. excel 2016 新建时 出现 内存或磁盘不足错误的解决方法
  13. 如何理解和应用Java的多态
  14. 线程同步---互斥锁和读写锁
  15. 密码学家王小云:十年破解MD5和SHA-1两大国际密码
  16. 汪磊老师整理的前端进阶课程目录
  17. 探索反汇编-在Linux环境下
  18. Linux中 ll 和 ls 区别
  19. 安卓学习专栏——百度地图(6)移动到我的位置(图文+代码)
  20. 黑马瑞吉外卖之新增员工

热门文章

  1. 科研论文投稿的那些事
  2. python数据库怎么下载_哪有Python数据库视频教程下载(python导入数据库视频教程)...
  3. 计算机毕业设计JavaHTML5寿光农产品资源展示平台(源码+系统+mysql数据库+lw文档)
  4. cocos2d 性能优化
  5. 适合中职学生的C语言课本,浅谈中职c语言校本教材的开发.pdf
  6. 制作手机动画屏保—Gif Tools
  7. QZ 5T 抓斗行车起重机 切电阻,空操,电气电器图纸一套这是调试后的最终版图纸,含CAD图纸
  8. 英文小语种网站采集翻译发布工具
  9. 迅捷PDF分割器如何将PDF拆分为多个文档
  10. AE2017免安装版使用粒子插件红巨星套装插件经验分享