为什么要热备份

  1. Lucene对索引是没有保证的(说的有点别扭原文用词是guarantee),意思是因为各种原因导致的索引破坏,这个真的不能怪它,倒排索引使用了大量类似指针链的方式来记录数据,所以部分的损坏就会导致整个完蛋。当然这不是说它就不可靠了,os也有crash的时候,大多数时候还是非常稳定的;
  2. 索引备份采用最多的当然是拷贝,可是在IndexWriter打开的情况下索引文件是不稳定实时变化的,所以必须在IndexWriter关闭的情况下才能拷贝。对于一个在线的网站来说这个是不能忍受的,特别是对于数据量比较大的站点,拷贝可能需要很长时间;
  3. 倒排索引之所以快是因为花费了大量时间先做分词,所以当索引crash后变成了不可再利用的垃圾,最好的办法也是官方推荐的办法就是重建,为了不让用户等待太久,最好的当然是从一个现有的最近的备份来恢复更新;
  4. 很多站点不允许停止搜索服务去备份,咱也不愿意大半夜去备份不是;

热备份

最理想的方式就是能always online的前提下备份,于是在2.3版本中引入了SnapshotDeletionPolicy,它的原理就是lucene可以保留一个commit了,这个commit就是snapshot,我觉得这是个很牛比的东西,就跟数据库的snapshot一样,不是谁都能轻轻松松做出来的,下面是实现新建一个保留最后一次提交策略的IndexWriter。

新建一个支持Sanpshot的writer
  1. IndexDeletionPolicy policy = new KeepOnlyLastCommitDeletionPolicy();
  2. SnapshotDeletionPolicy snapshotter = new SnapshotDeletionPolicy(policy);
  3. IndexWriter writer = new IndexWriter(dir, analyzer, snapshotter,
  4. IndexWriter.MaxFieldLength.UNLIMITED);

下面是需要热备份时调用的代码

备份的代码
  1. try {
  2. IndexCommit commit = snapshotter.snapshot();
  3. Collection<String> fileNames = commit.getFileNames();
  4. /*<iterate over & copy files from fileNames>*/
  5. } finally {
  6. snapshotter.release();
  7. }

使用热备份需要注意的地方

  1. snapshotter每次备份完要release(),不然writer不会删除这个commit;
  2. 如果你有多个writer,那么自求多福吧,我一直认为多个w是自己抽自己的行为;
  3. 每次getFileNames()出来可以做一个比较,因为lucene是一次写入的,意思是尽量重用已经写入的数据,所以只要文件名相同不需要hash检查可以武断的认为他们的数据是一样的,更新的时候可以删除没有在这个list的文件,segment是每次都会被重写的,这个谁都知道;
  4. 使用热备份肯定会比原来多出很多文件,占用空间增加也是正常的,所以要留好足够的空间;
  5. 有经常开关writer的同学要注意,在section2代码中拷贝时不能关闭writer,如果你一定要这么干,可以写一个保留当前commit的策略,当然同时还会带来其它问题;
本文转自today4king博客园博客,原文链接:http://www.cnblogs.com/jinzhao/archive/2013/01/14/2859715.html,如需转载请自行联系原作者

Lucene 如何热备份相关推荐

  1. lucene 增加相关性_事务性Lucene

    lucene 增加相关性 许多用户不喜欢Lucene API的事务性语义,以及这在搜索应用程序中如何有用. 首先,Lucene实现了ACID属性: 一个 tomicity:当您在更改(添加,删除文件) ...

  2. 2021年大数据ELK(四):Lucene的美文搜索案例

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 美文搜索案例 一.需求 二.准备工作 1.创建IDEA项目 2. ...

  3. 2021年大数据ELK(三):Lucene全文检索库介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.什么是全文检索 1.结构化数据与非结构化数据 2.搜索结构化 ...

  4. lucene.net mysql_用Lucene[1].net对数据库建立索引及搜索+

    cs代码 using System; using System.Collections; using System.ComponentModel; using System.Data; using S ...

  5. lucene构建同义词分词器

    lucene4.0版本号以后 已经用TokenStreamComponents 代替了TokenStream流.里面包含了filter和tokenizer 在较复杂的lucene搜索业务场景下,直接网 ...

  6. 影响Lucene索引速度原因以及提高索引速度技巧

    在网上看了一篇外文文章,里面介绍了提高Lucene索引速度的技巧,分享给大家. 先来看下影响索引的主要因素: MaxMergeDocs 该参数决定写入内存索引文档个数,到达该数目后就把该内存索引写入硬 ...

  7. Lucene.net中文分词探究

    一.中文分词方式: 中文分词几种常用的方式: A. 单字分词 单字分词,顾名思义,就是按照中文一个字一个字地进行分词.如:我们是中国人,效果:我/们/是/中/国/人. B. 二分法 二分法,就是按两个 ...

  8. 【Java】Lucene检索引擎详解

    基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能. L ...

  9. Lucene:基于Java的全文检索引擎简介(转载)

    Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 全文检索的实现:Luene全文索引和数据库索引的比较 中文切分词机制简介:基 ...

  10. Cisco HSRP热备份路由器协议配置

    HSRP热备份路由器协议: HSRP是 Hot Standby Routing Protocol(热备份路由协议)的缩写,它的作用是当核心路由器不能正常工作时, 备用路由器能够实现自动平滑的替换,以保 ...

最新文章

  1. 客快物流大数据项目(七):Docker总结
  2. 7-18 银行业务队列简单模拟 (25 分)
  3. 在react-router中进行代码拆分
  4. Python小知识: List的赋值方法,不能直接等于
  5. Automatic Exploit Generation:漏洞利用自动化
  6. 网易云信安全体系全面升级,获公安部信息安全认证
  7. 解析:为什么人工智能要用Python?
  8. 哇靠靠,这也行?零基础DIY无人驾驶小车(一)
  9. C Builder中如何利用消息
  10. python 字符串处理 字典_python 字符串和字典
  11. PowerDesigner15 下载 数据库建模工具
  12. 利用GSM模块通过GPRS在GMSK调制方式下与IP网通信
  13. nginx的虚拟用户以及负载均衡
  14. 手把手教你由TensorFlow上手PyTorch(附代码)
  15. 第一章、银行会计的基本原理和基本核算方法
  16. 苹果手机备份数据到电脑什么位置 iPhone备份到电脑上的东西在哪里
  17. 运行IE显示“该文件没有程序与之关联来执行该操作”
  18. Running “flutter pub get“ in xxx... 报错: Git error 443
  19. 宣布造车后股价上演“过山车”,开心汽车如意算盘恐落空
  20. 从“站在巨人的肩上”到“跪到侏儒之脚下”——图灵公司副主编自供(二)...

热门文章

  1. mysql各存储引擎介绍表格_十六、MySQL基础系列笔记之数据表存储引擎的介绍
  2. php mpm,Ubuntu Apache 切换到php-fpm+mpm_event模式
  3. 学python最好的方法_对于Python初学者,怎么学才能快速高薪?牢记四条!
  4. C#封装DLL类库,调用类库
  5. vue使用echarts地图数据分析
  6. linux 安装npm
  7. No package ‘polkit-gobject-1‘ found
  8. 六石管理学:新增一类产品问题,面子类问题
  9. 转帖科学观点:没有特异性的免疫屏障
  10. LINUX用终端命令调用打印机属性