lucene 增加相关性

许多用户不喜欢Lucene API的事务性语义,以及这在搜索应用程序中如何有用。 首先,Lucene实现了ACID属性:

  • 一个 tomicity:当您在更改(添加,删除文件) IndexWriter会话,然后提交,要么全部(如果提交成功)或无的更改(如果提交失败)将是可见的,从来没有的东西在两者之间。 某些方法具有其自己的原子行为:如果调用updateDocument ,该方法实现为删除操作,然后执行添加操作,即使打开近实时(NRT)阅读器或从单独的线程提交。 同样,如果使用相对较新的 addDocuments方法添加文档块,则在获得的任何阅读器中都不会看到任何文档或全部文档。
  • Çonsistency:如果计算机或操作系统崩溃,或JVM崩溃或被杀,或断电,你的指数将保持不变(即,未破坏)。 请注意,其他问题(例如RAM损坏,CPU翻转或文件系统损坏)仍然很容易损坏索引!
  • 我这样想 :在IndexWriter进行更改时,任何对搜索索引的IndexReader都不可见,直到您提交或打开新的NRT阅读器。 一次仅一个IndexWriter实例可以更改索引。
  • d urability:一旦commit的回报,所有的改变都被写入持久性存储器(假设你的I / O系统正确实现fsync )。 如果计算机或操作系统崩溃,或者JVM崩溃或被杀死,或者计算机断电,则所有更改仍将存在于索引中。

Lucene提供了两阶段的提交 API:调用prepareCommit方法来完成所有艰苦的工作(应用缓冲的删除,编写缓冲的文档,fsync文件)。 如果出现问题(例如磁盘已满),几乎肯定会在第一阶段发生。 然后,调用commit完成事务。

当您关闭IndexWriter ,它commitIndexWriter调用commit 。 相反,如果您想放弃自上一次提交以来的所有更改,请改为调用rollback方法,该方法也将关闭编写器。 您甚至可以回滚CREATE :如果您已有索引,并使用OpenMode.CREATE在其上打开IndexWriter ,然后回滚,则索引将保持不变。 同样,如果调用deleteAll然后回滚。

注意,仅在新目录上打开IndexWriter并不会创建空提交。 也就是说,您必须先调用commit才能在目录上打开IndexReader

Lucene本身并没有实现事务日志 ,但是很容易在顶层构建该层。 例如,流行的搜索服务器(例如Solr和ElasticSearch )就是这样做的。

在一个索引中多次提交

一个Lucene索引可以自由包含多个提交; 这是一个功能强大但经常被忽略的功能。 每个提交都拥有创建提交时所存在的索引的时间点视图。

这类似于ZFS和即将出现的Btrfs等现代文件系统中可用的快照和可写克隆。 实际上,Lucene能够基于相同的根本原因有效地公开多个提交:所有索引段和文件都是一次写入的,就像ZFS和Btrfs中的文件块一样。

要在索引中保存多个提交,只需实现自己的IndexDeletionPolicy并将其传递给IndexWriter 。 这是Lucene用来了解应删除哪些提交的类: IndexWriter在打开索引时以及每次提交成功时都会调用它。 默认策略KeepOnlyLastCommitDeletionPolicy删除除最后一次提交以外的所有内容。 如果您使用NoDeletionPolicy则将保留每个提交!

您可以将userDataMap<String,String> )传递给commit ,以记录有关该提交的自定义信息(对Lucene不透明),然后使用IndexReader.listCommits在索引中查找所有提交。 找到提交后,您可以在其上打开IndexReader来搜索该提交时的索引。

您还可以在先前的提交上打开IndexWriter ,以有效地回滚之后的所有更改:这与rollback方法类似,不同之处在于,它使您可以提交进行回滚,而不仅仅是在当前IndexWriter会话中进行的更改。

即使使用OpenMode.CREATE打开索引,旧提交仍将保留。 当IndexReader仍在搜索旧提交时,传递OpenMode.CREATE也可以。 这可以实现有趣的用例,例如在每次提交之间完全重新索引您的内容,而不会影响任何开放的读者。

结合所有这些有趣的事务功能,您可以做一些很酷的事情:

  • 使用SnapshotDeletionPolicyPersistentSnapshotDeletionPolicy 热备份 :这些删除策略使“实时”备份索引变得很简单,而不会阻止使用IndexWriter进行的更改。 备份可以很容易地进行增量备份(只需复制新文件,删除已删除的文件),就可以自由限制IO以最大程度地减少对搜索的干扰。
  • 搜索不同的目录版本:也许您运行了一个电子商务网站,但是却发布了多个版本的目录。 在这种情况下,您可以保留较旧的提交,每次提交都搜索目录的特定版本,从而使用户可以选择要搜索的目录。
  • 来自相同初始索引的可重复索引测试:也许您想运行一堆性能测试,也许从一个大的初始索引开始尝试不同的RAM缓冲区大小或合并因子。 为此,只需运行每个测试,但是最后,不要关闭IndexWriter ,而使用rollback方法将索引快速返回其初始状态,以准备进行下一个测试。
  • 强制将所有索引段合并到单个段,但同时保留先前的多段提交。 然后,您可以进行测试以比较多段性能与单段性能。
  • 索引和搜索NFS文件系统 :因为NFS不能保护仍处于打开状态的文件不被删除,所以必须使用IndexDeletionPolicy保留每个提交,直到所有打开的阅读器都完成了提交(即,重新打开为新的提交)。 简单的方法是基于时间的,例如:不要删除提交,直到提交时间为15分钟,然后始终每5分钟重新打开阅读器一次。 没有这个,在NFS上搜索时,您将遇到各种可怕的异常。
  • 分布式提交:如果您还有其他资源必须随原子对Lucene索引的更改一起提交,则可以使用两阶段提交API。 这很简单,但是很容易在第二阶段失败。 为了从这种情况下恢复过来,例如,如果Lucene完成了其第二阶段的提交,但是数据库的第二阶段遇到了一些错误,崩溃或断电,则可以通过在先前的提交上打开IndexWriter轻松回滚Lucene的提交。
  • 实验性的索引更改:也许您想尝试以新的方式重新索引索引的某些子集,但是您不确定它是否会成功。 在这种情况下,只需保留旧的提交,然后在未解决的情况下回滚,或者如果删除则删除旧的提交。
  • 基于时间的快照:也许您希望自由地回滚到1天,1周前,1个月前等的索引,因此您可以根据提交的时间来保留提交。

请记住,保持多个提交活动必定会占用额外的磁盘空间,但是,开销通常很小,因为多个提交通常会共享公共段,尤其是较大的旧段。

参考:来自我们的JCG合作伙伴 Michael Mc Candless的事务性Lucene,来自“ 更改比特”博客。

翻译自: https://www.javacodegeeks.com/2013/06/transactional-lucene.html

lucene 增加相关性

lucene 增加相关性_事务性Lucene相关推荐

  1. lucene 查询示例_高级Lucene查询示例

    lucene 查询示例 本文是我们名为" Apache Lucene基础知识 "的学院课程的一部分. 在本课程中,您将了解Lucene. 您将了解为什么这样的库很重要,然后了解Lu ...

  2. lucene学习笔记_学习Lucene

    lucene学习笔记 我目前正在与一个团队合作,开始一个基于Lucene的新项目. 虽然大多数时候我会争论使用Solr还是Elasticsearch而不是简单的Lucene,但这是一个有意识的决定. ...

  3. lucene快速入门_为Lucene选择快速唯一标识符(UUID)

    lucene快速入门 大多数使用Apache Lucene的搜索应用程序都会为每个索引文档分配一个唯一的ID(即主键). 尽管Lucene本身不需要这样做(它可能不太在乎!),但应用程序通常需要它以后 ...

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

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

  5. Solr相似度算法一:Lucene TF-IDF 相关性算分公式

     Solr相似度算法一:Lucene TF-IDF 相关性算分公式 Lucene在进行关键词查询的时候,默认用TF-IDF算法来计算关键词和文档的相关性,用这个数据排序 TF:词频,IDF:逆向文 ...

  6. SpringCloud学习笔记024---SpringBoot集成Lucene实现全文检索_分词_索引_更新_删除文档_词条搜索_多条件查询

    JAVA技术交流QQ群:170933152 先看代码实现,下面有lucene介绍: 测试用例 Github 代码 代码我已放到 Github ,导入spring-boot-lucene-demo 项目 ...

  7. lucene 多个分词查找_使用Lucene的新FreeTextSuggester查找长尾建议

    lucene 多个分词查找 Lucene的" 建议"模块提供了许多有趣的自动建议实现,以便在用户将每个字符输入搜索框时为他们提供实时搜索建议. 例如, WFSTCompletion ...

  8. Lucene学习总结之六:Lucene打分公式的数学推导

     Lucene学习总结之六:Lucene打分公式的数学推导 在进行Lucene的搜索过程解析之前,有必要单独的一张把Lucene score公式的推导,各部分的意义阐述一下.因为Lucene的搜索 ...

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

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

最新文章

  1. 如何将Numpy加速700倍?用 CuPy 呀
  2. 服务器空岛怎么修改地形,迷你世界空岛地形码是什么 空岛地形码怎么输入[多图]...
  3. bzoj4383(拓扑排序)
  4. asp.net core中使用cookie身份验证
  5. java实时更新权限_java – 如何使用Spring Security重新加载用户更新的权限
  6. WWDC 2019 大会前瞻:暗黑模式来袭、iOS 与 macOS 互通?
  7. 12306订票助手秘笈:2013春节我要回家
  8. php 调试常用函数,PHP几个常用的去空、分组、调试数组函数
  9. webpack打包优化_Webpack 构建速度优化
  10. 简单工厂(Java)
  11. Java 版本中文数字转阿拉伯数字实现
  12. 1. MyBatis框架介绍
  13. SEO之网站标题间隔符
  14. 洛谷 UVA1395 苗条的生成树 Slim Span
  15. 网络安全加固的必要性
  16. 嵌入式--轮询调度模块
  17. 影像的滑动窗口裁切与拼接(附代码)
  18. 为什么年终奖是一个彻头彻尾的职场圈套?
  19. 数学史资料:中世纪数学
  20. 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换

热门文章

  1. 2019年这50个Kafka面试题,你知道答案么
  2. [初级]Java中的switch对整型、字符型、字符串的具体实现细节
  3. 百度分布式配置管理平台-Disconf
  4. 【php】正则无法截取\反斜杠的解决方法
  5. python爬虫进阶(初始)
  6. SpringMVC的上传与下载
  7. SpringMVC的视图解析器
  8. 2018蓝桥杯省赛---java---B---6(递增三元组)
  9. 亚信科技笔试面试2019届
  10. java 时钟 算法分析_java实现时钟方法汇总