lucene搜索优化
最近一直在做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搜索优化相关推荐
- vc++调用jni_通过JNI使用C ++尖叫快速进行Lucene搜索
vc++调用jni 最终,当Lucene执行查询时,在初始设置后,真正的热点通常是相当基本的代码,该代码对整数docID,术语频率和位置的顺序块进行解码,并将它们匹配(例如,对BooleanQuery ...
- 通过JNI使用C ++尖叫快速进行Lucene搜索
一天结束时,Lucene执行查询时,在初始设置后,真正的热点通常是相当基本的代码,它解码整数docID,术语频率和位置的顺序块,并对其进行匹配(例如,对BooleanQuery并集或交集),则为每个匹 ...
- vue 同一个域名移动端pc端两套代码跳转_百度移动搜索优化:手机站优化指南
百度移动搜索是全球最大的中文手机搜索引擎,每天用户使用百度移动搜索发起的搜索请求高达数亿次.本文档旨在为手机站站长提供官方.明确的搜索引擎优化标准,使站长合理.可持续的提升手机站流量,获得长久.稳定的 ...
- 帝国cms7.5百度小程序针对搜索引擎自然搜索优化版生成静态版
最新更新 2020-04-02 18:45:00 相关搜索优化功能 第一.接入自然搜索,小程序新资源提交,自动同步提交/swan-sitemap/index 第二.修正小程序页面地址url,则原来的n ...
- 使用 Apache Lucene 搜索文本——轻松为应用程序构建搜索和索引功能
简介: 本文将探讨 Apache Lucene -- 性能卓越.功能全面的文本搜索引擎库.我们将学习 Lucene 架构及其核心 API.学习如何使用 Lucene 进行跨平台全文本搜索.建立索引.显 ...
- Lucene学习总结之七:Lucene搜索过程解析
一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: ...
- lucene 搜索_使用Lucene的搜索服务器搜索Jira问题
lucene 搜索 您可能还记得我的第一篇博客文章 ,该文章描述了Lucene开发人员如何使用Lucene搜索应用程序查找我们的Jira问题来食用我们自己的狗粮. 该应用程序已成为许多现代Lucene ...
- outlook搜索栏跑到上面去了_长春企业网站搜索优化如何做
如何做企业l31b10网站搜索优化长春,SEO排名,它是指搜索引擎优化关键词排名.而影响到seo排名的因素有很多,比如说域名注册的时间,服务器的空间速度和稳定性,或者像是网站整体的结构,网站的内容等等 ...
- 微信全文搜索优化之路
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者: jiaminchen,微信终端开发团队的一员 本文首次发表在<程序员>杂志 2017 年 09 月期. 前言 基于本地 ...
最新文章
- JEECMS8——系列文档
- ftp服务器搭建(离线安装vsftpd),配置
- 如何阅读AI顶会论文,搭建深度学习知识体系框架?
- IDEA中创建类时,自动在文件头中添加作者以及创建时间
- C语言满分代码:L1-050 倒数第N个字符串 (15分)
- iTerm2 快捷键
- java gui 按键 数组_java GUI分配数组值
- js去el的map_JS中也可以使用JSTL和EL标签
- idea新建xml文件
- mac maven安装位置_Maven的安装以及仓库的作用
- 三类MySQL_Mysql中的三类锁,你知道吗?
- excel 2016 新建时 出现 内存或磁盘不足错误的解决方法
- 如何理解和应用Java的多态
- 线程同步---互斥锁和读写锁
- 密码学家王小云:十年破解MD5和SHA-1两大国际密码
- 汪磊老师整理的前端进阶课程目录
- 探索反汇编-在Linux环境下
- Linux中 ll 和 ls 区别
- 安卓学习专栏——百度地图(6)移动到我的位置(图文+代码)
- 黑马瑞吉外卖之新增员工
热门文章
- 科研论文投稿的那些事
- python数据库怎么下载_哪有Python数据库视频教程下载(python导入数据库视频教程)...
- 计算机毕业设计JavaHTML5寿光农产品资源展示平台(源码+系统+mysql数据库+lw文档)
- cocos2d 性能优化
- 适合中职学生的C语言课本,浅谈中职c语言校本教材的开发.pdf
- 制作手机动画屏保—Gif Tools
- QZ 5T 抓斗行车起重机 切电阻,空操,电气电器图纸一套这是调试后的最终版图纸,含CAD图纸
- 英文小语种网站采集翻译发布工具
- 迅捷PDF分割器如何将PDF拆分为多个文档
- AE2017免安装版使用粒子插件红巨星套装插件经验分享