【转载保存】基于Lucene的近实时搜索引擎优化总结

一、搜索优化:

    在工程领域,越是看起来“简单、确定”的问题,越是难以解决。近实时搜索引擎需要解决的问题只有一个:性能!它包含快速索引,快速搜索,以及索引到搜索的快速生效。

    以下为百万条数据级(适用于千万级)快速滚动数据近实时搜索引擎实践经验总结:

 

 1. 针对技术优化

    1.1 数值搜索优化: 将数值的范围缩小,能用 int值 的不要用 long值,能用 float值 的不用要 double值;能用string 替换的,就不要用范围查询(特别是大范围查询),这些都基于Lucene搜索引擎对数值建索引和范围查询的原理和特点所决定;

    1.2 搜索语法的简化和高级搜索的支持取得一个平衡点: 谨慎用"*","?"(Wildcard搜索),禁止出现 "*AA"的查询,如果必须支持这样的查询,则需要培训用户了解"*"可能引起的性能问题。

 

 2. 针对业务优化

    2.1 特别强调范围查询,必须优化。避免大范围数值查询,数值范围查询不可避免的情况下,尽量使用小范围,这是由业务性质决定的,比如:说 A > 0的查询,需要优化为某个更有意义的查询: [A : 0-100]。

    2.2 能使用短字符串(特别是不做分词的字符串)搜索的来替代,一定不要用数值搜索。数值搜索的特定虽然快,但对范围查询,它有一定的代价,如果使用不合适,代价会很大。

 

二、索引优化:

    优秀的搜索引擎是快速创建索引和快速搜索的一个平衡体。特别对近实时搜索引擎而言,这个平衡点更为难以达到。

    通过一系列测试和验证,Lucene在【搜索】,【索引】以及【优化】之间要达到平衡其实很不容易。在频繁的搜索和索引下,在线的优化难以真正起效果。可以理解为优先级有这样的特性:搜索 > 索引 > 优化。搜索的时间相对最短,优化的时间最长。在前二者频繁操作下,优化没有机会(强行优化只能导致,搜索和索引停顿,对近实时系统来说不可接受)。因而必须设置好相应的参数,主要包括:缓存大小,索引内存大小,索引单次提交数量上限(等同Merge因子,Lucene不一定严格执行),搜索最大并发数等。

    大部分的索引优化是基于搜索业务的,如上述一所描述的用字符串字段替代数值范围查询。而索引本身的创建方式又直接影响到搜索,对Lucene来说Merge因子的配置是个关键(内存足够大的情况下)。简单的说,Merge因子小,索引慢,但对大批量建索引性能影响却不大(索引内存足够大为前提),但同时它会使得索引段落数被限制在合理范围值(直接影响索引段数——搜索性能)。相反如果Merge因子小,搜索会很快,段数也大,如果不及时做索引优化,对搜索性能的影响是致命的。

 

三、分布式平衡

    一台Lucene服务器要想达到近实时搜索基本是不可能的,除非搜索量非常小。单台搜索量5个/s以上,一台基于Lucene的实时搜索基本上会吃不消,原因不在于搜索本身,而在于索引的同时,保证搜索实时性。而建索引的过程如果产生的碎片(段)过多,会直接影响搜索。总结下来,给予建索引的服务器一定的空闲时间是必须的,也就是说在建索引的时间段,搜索不能太过频繁。因而分布式分摊搜索压力是很有必要的。

 

 

总结:

    1. 目前3台基于Lucene的PC服务器,高峰并发数量在15个/s左右;

    2. 数据量为百万条级别(不到200万),单条数据80个字段,每条大概为200字符(中文、英文、数字);

    3. 搜索条件基本在7-20关键字,平均搜索速度为98ms;

  4. 最慢的搜索为350ms(毫秒)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

经典语音论文

经典语音论文: 语音合成,语音识别 为主 https://github.com/zzw922cn/awesome-speech-recognition-speech-synthesis-papers

【转载保存】linux shell字符串切割成数组

原地址:https://www.cnblogs.com/FlyFive/p/3640243.html a"one,two,three,four" 要将$a分割开,可以这样: 按 CtrlC 复制代码 按 CtrlC 复制代码 上述代码会输出 one two three four arr($a)用于将字符串$a分割到数组$arr …

CTC 语音基础 GMM EM

Connectionist Temporal Classification (CTC)算法解释 https://www.jianshu.com/p/0cca89f64987 语音中响度,音调与音色的影响因素 https://blog.csdn.net/qq_37385726/article/details/89176142 GMM模型与EM算法 https://blog.csdn.ne…

shell 字符串切割

a"one,two,three,four" 要将$a分割开,可以这样: 按 CtrlC 复制代码 按 CtrlC 复制代码 上述代码会输出 one two three four arr($a)用于将字符串$a分割到数组$arr ${arr[0]} ${arr[1]} ... 分别存储分割后的数组第1 2 ... 项 &#xf…

【转载保存】修改IK分词器源码实现动态加载词典

链接:http://www.gongstring.com/portal/article/index/id/59.html 当前IKAnalyzer从发布最后一个版本后就一直没有再更新,使用过程中,经常遇到需要扩展词库以及动态更新字典表的问题,此处给出一种解决办法(注意&…

【转载保存】Lucene 实战教程第六章 Lucene 的精确、包含、集合查询 Query 的简单使用

原链接:https://www.xttblog.com/?p3532 所有的搜索基本上都存在精确匹配,包含等操作。Lucene 中同样存在这样的操作,今天我们以 IntPoint 为例,来说说 Lucene 中的精确查询。 IntPoint、LongPoint、FloatPoint、DoublePoint 这…

【待解答】文件目录可以利用foreach边遍历边删除操作,为什么?

Testpublic void demoTestDitDel() {File file new File(util.Directory.GetAppPath("test"));File[] fs file.listFiles();for (File f : fs) {f.delete();System.out.println("del");}} 有时间再解答:

lucene分布式索引

当数据量较大访问量较大的时候,分布式就不可避免,我现在知道的处理方式有下面几种: 1,用一个好服务器作为索引服务器,磁盘冗余的方式保证搜索的正常进行; 2,索引服务器用一台,检索…

【转载保存】lucene3.0可以对docId、docField、queryParser设置Boost值来影响排序结果

转自:http://catastiger.iteye.com/blog/803796 前提:不对结果做sort操作. 在搜索中,并不是所有的Document和Fields都是平等的.有些技术会要求到对其Doucment或者Fields的权值改变,默认值为:1.0F,以上需求都是通过改变Document的boost因子来改变的. 下面是通过…

lucene6.0 查询语句设置关键字boost值

代码模板: public class Demo {public static void main(String[] args) throws IOException, Exception {//建立索引String indexDirPath util.Directory.GetAppPath("indexDir");Path path Paths.get(indexDirPath);StandardAnalyzer analyzer new …

【转载保存】Lucene7.1.0超详细的使用文档

转载地址:https://www.cnblogs.com/houzheng/p/9150314.html

【转载保存】lucene优秀文章整理

Lucene解析 - 基本概念: https://www.jianshu.com/p/fbb171e73721?fromtimeline&isappinstalled0 Lucene DocValues——没有看懂: https://www.cnblogs.com/bonelee/p/6669263.html Lucene DocValues详解: https://blog.csdn.net/zteny/article/details/60633374 So…

lucene中write.lock索引锁机制的原理

write.lock加锁的实现原理: 实现源码(lucene 6.0): Override protected Lock obtainFSLock(FSDirectory dir, String lockName) throws IOException {Path lockDir dir.getDirectory();// Ensure that lockDir exists and is a…

正则表达式大全

[正则表达式]文本框输入内容控制 整数或者小数:^[0-9]\.{0,1}[0-9]{0,2}$ 只能输入数字:"^[0-9]*$"。 只能输入n位的数字:"^\d{n}$"。 只能输入至少n位的数字:"^\d{n,}$"。 只能输入m~n位的数字&am…

天气数据获取接口和网址汇总

免费API:https://www.sojson.com/blog/305.html 爬取网址:http://www.weather.com.cn/ https://www.tianqi.com/chinacity.html

鸡汤

史蒂芬柯维的7个习惯就是自己的原则和价值观: 积极主动以终为始要事第一双赢思维知彼解己综合综效不断更新 稻盛和的原则和价值观比如六项精进: 付出不亚于任何人的努力要谦虚,不要骄傲要每天反省或者就要感谢积善行,思利他不要…

【转载保存】索引文件锁LockFactory

索引文件锁LockFactory LockFactory在Lucene中用来对索引文件所在的目录进行加锁,使得同一时间总是只有一个IndexWriter对象可以更改索引文件,即保证单进程内(single in-process)多个不同IndexWriter对象互斥更改(多线程持有相同引用的IndexW…

lucene大牛博客汇总保存

https://www.amazingkoala.com.cn/Lucene/Index/http://codepub.cn/tags/Lucene/

no segments* file found in SimpleFSDirectory问题总结

lucene6.0版本 场景一:第一次启动程序索引库为空抛出异常 最近在写lucene发现利用lucene6.0版本时候如果索引库为空构建indexWriter,代码如下: IndexWrterConfig config new IndexWriterConfig(analyzer); IndexWriter indexWriter new …