Lucene 如何热备份
为什么要热备份
- Lucene对索引是没有保证的(说的有点别扭原文用词是guarantee),意思是因为各种原因导致的索引破坏,这个真的不能怪它,倒排索引使用了大量类似指针链的方式来记录数据,所以部分的损坏就会导致整个完蛋。当然这不是说它就不可靠了,os也有crash的时候,大多数时候还是非常稳定的;
- 索引备份采用最多的当然是拷贝,可是在IndexWriter打开的情况下索引文件是不稳定实时变化的,所以必须在IndexWriter关闭的情况下才能拷贝。对于一个在线的网站来说这个是不能忍受的,特别是对于数据量比较大的站点,拷贝可能需要很长时间;
- 倒排索引之所以快是因为花费了大量时间先做分词,所以当索引crash后变成了不可再利用的垃圾,最好的办法也是官方推荐的办法就是重建,为了不让用户等待太久,最好的当然是从一个现有的最近的备份来恢复更新;
- 很多站点不允许停止搜索服务去备份,咱也不愿意大半夜去备份不是;
热备份
最理想的方式就是能always online的前提下备份,于是在2.3版本中引入了SnapshotDeletionPolicy,它的原理就是lucene可以保留一个commit了,这个commit就是snapshot,我觉得这是个很牛比的东西,就跟数据库的snapshot一样,不是谁都能轻轻松松做出来的,下面是实现新建一个保留最后一次提交策略的IndexWriter。
- IndexDeletionPolicy policy = new KeepOnlyLastCommitDeletionPolicy();
- SnapshotDeletionPolicy snapshotter = new SnapshotDeletionPolicy(policy);
- IndexWriter writer = new IndexWriter(dir, analyzer, snapshotter,
- IndexWriter.MaxFieldLength.UNLIMITED);
下面是需要热备份时调用的代码
- try {
- IndexCommit commit = snapshotter.snapshot();
- Collection<String> fileNames = commit.getFileNames();
- /*<iterate over & copy files from fileNames>*/
- } finally {
- snapshotter.release();
- }
使用热备份需要注意的地方
- snapshotter每次备份完要release(),不然writer不会删除这个commit;
- 如果你有多个writer,那么自求多福吧,我一直认为多个w是自己抽自己的行为;
- 每次getFileNames()出来可以做一个比较,因为lucene是一次写入的,意思是尽量重用已经写入的数据,所以只要文件名相同不需要hash检查可以武断的认为他们的数据是一样的,更新的时候可以删除没有在这个list的文件,segment是每次都会被重写的,这个谁都知道;
- 使用热备份肯定会比原来多出很多文件,占用空间增加也是正常的,所以要留好足够的空间;
- 有经常开关writer的同学要注意,在section2代码中拷贝时不能关闭writer,如果你一定要这么干,可以写一个保留当前commit的策略,当然同时还会带来其它问题;
Lucene 如何热备份相关推荐
- lucene 增加相关性_事务性Lucene
lucene 增加相关性 许多用户不喜欢Lucene API的事务性语义,以及这在搜索应用程序中如何有用. 首先,Lucene实现了ACID属性: 一个 tomicity:当您在更改(添加,删除文件) ...
- 2021年大数据ELK(四):Lucene的美文搜索案例
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 美文搜索案例 一.需求 二.准备工作 1.创建IDEA项目 2. ...
- 2021年大数据ELK(三):Lucene全文检索库介绍
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.什么是全文检索 1.结构化数据与非结构化数据 2.搜索结构化 ...
- lucene.net mysql_用Lucene[1].net对数据库建立索引及搜索+
cs代码 using System; using System.Collections; using System.ComponentModel; using System.Data; using S ...
- lucene构建同义词分词器
lucene4.0版本号以后 已经用TokenStreamComponents 代替了TokenStream流.里面包含了filter和tokenizer 在较复杂的lucene搜索业务场景下,直接网 ...
- 影响Lucene索引速度原因以及提高索引速度技巧
在网上看了一篇外文文章,里面介绍了提高Lucene索引速度的技巧,分享给大家. 先来看下影响索引的主要因素: MaxMergeDocs 该参数决定写入内存索引文档个数,到达该数目后就把该内存索引写入硬 ...
- Lucene.net中文分词探究
一.中文分词方式: 中文分词几种常用的方式: A. 单字分词 单字分词,顾名思义,就是按照中文一个字一个字地进行分词.如:我们是中国人,效果:我/们/是/中/国/人. B. 二分法 二分法,就是按两个 ...
- 【Java】Lucene检索引擎详解
基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能. L ...
- Lucene:基于Java的全文检索引擎简介(转载)
Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 全文检索的实现:Luene全文索引和数据库索引的比较 中文切分词机制简介:基 ...
- Cisco HSRP热备份路由器协议配置
HSRP热备份路由器协议: HSRP是 Hot Standby Routing Protocol(热备份路由协议)的缩写,它的作用是当核心路由器不能正常工作时, 备用路由器能够实现自动平滑的替换,以保 ...
最新文章
- 客快物流大数据项目(七):Docker总结
- 7-18 银行业务队列简单模拟 (25 分)
- 在react-router中进行代码拆分
- Python小知识: List的赋值方法,不能直接等于
- Automatic Exploit Generation:漏洞利用自动化
- 网易云信安全体系全面升级,获公安部信息安全认证
- 解析:为什么人工智能要用Python?
- 哇靠靠,这也行?零基础DIY无人驾驶小车(一)
- C Builder中如何利用消息
- python 字符串处理 字典_python 字符串和字典
- PowerDesigner15 下载 数据库建模工具
- 利用GSM模块通过GPRS在GMSK调制方式下与IP网通信
- nginx的虚拟用户以及负载均衡
- 手把手教你由TensorFlow上手PyTorch(附代码)
- 第一章、银行会计的基本原理和基本核算方法
- 苹果手机备份数据到电脑什么位置 iPhone备份到电脑上的东西在哪里
- 运行IE显示“该文件没有程序与之关联来执行该操作”
- Running “flutter pub get“ in xxx... 报错: Git error 443
- 宣布造车后股价上演“过山车”,开心汽车如意算盘恐落空
- 从“站在巨人的肩上”到“跪到侏儒之脚下”——图灵公司副主编自供(二)...
热门文章
- mysql各存储引擎介绍表格_十六、MySQL基础系列笔记之数据表存储引擎的介绍
- php mpm,Ubuntu Apache 切换到php-fpm+mpm_event模式
- 学python最好的方法_对于Python初学者,怎么学才能快速高薪?牢记四条!
- C#封装DLL类库,调用类库
- vue使用echarts地图数据分析
- linux 安装npm
- No package ‘polkit-gobject-1‘ found
- 六石管理学:新增一类产品问题,面子类问题
- 转帖科学观点:没有特异性的免疫屏障
- LINUX用终端命令调用打印机属性