lucene 增加相关性_事务性Lucene

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 增加相关性

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

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

相关文章

新版ipados可以编辑C语言吗,iPadOS新增了五个有用的功能,看你需不需要

主屏幕上的可自定义小部件苹果通过“ iOS 14”对“小工具”进行了大修&#xff0c;引入了新的设计&#xff0c;功能和自定义选项。这些“小部件”也出现在在iPhone上&#xff0c;您可以抓住任何小部件并将其添加到应用程序图标旁边的“主屏幕”中&#xff0c;但是不能在“ iPad…

JavaParser生成,分析和修改Java代码

作为开发人员&#xff0c;我们经常鄙视手动进行重复工作的人员。 我们认为&#xff0c; 他们应该实现这一目标 。 尽管如此&#xff0c;我们还是进行与编码有关的所有活动。 当然&#xff0c;我们使用的高级IDE可以为我们执行一些重构&#xff0c;但这基本上就是结束了。 我们…

C语言去括号编程题,去括号 - C语言网

题目描述当老师不容易&#xff0c;尤其是当小学的老师更难:现在的小朋友做作业喜欢滥用括号。虽然不影响计算结果&#xff0c;但不够美观&#xff0c;容易出错&#xff0c;而且可读性差。但又不能一棒子打死&#xff0c;也许他们就是将来的“陈景润”呢&#xff01;为了减轻老师…

c语言中删除有序数组中重复元素,去除有序列表中的重复元素

2014-10-27 09:13:00更新你仔细研究一下我写的 testAsignPoint 和 testAsignPointAgain 函数就会明白为什么你的二级指针无效了。还是那句话&#xff0c;你要记住&#xff0c;指针就是一个变量&#xff0c;存的是32位数据&#xff0c;记住这个才能真正的理解指针。另外 pezy 说…

阿卡接口_阿卡vs风暴

阿卡接口我最近在Twitter的Storm上工作了一段时间&#xff0c;这让我想知道&#xff0c;它与另一个高性能的并发数据处理框架Akka相比如何 。 什么是Akka和Storm&#xff1f; 让我们从两个系统的简短描述开始。 Storm是一种分布式实时计算系统。 在Storm集群上&#xff0c;您执…

c 语言已知两点求第三点,已知3点座标,求第一点到第二点和第三点构成的直线的距离。...

已知3点座标&#xff0c;求第一点到第二点和第三点构成的直线的距离。以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;已知3点座标&#xff0c;求第一点到第二点和第三点构成的直线的距离。解…

连续交付友好的Maven版本

持续交付管道需要可预测的软件和依赖版本。 Maven软件项目中常见的快照版本与“持续交付”背后的动机背道而驰。 为了将快照版本更新为发行版本&#xff0c;开发人员通常手动或通过诸如maven-release-plugin来编辑pom.xml文件。 但是&#xff0c;Maven还提供了将版本号定义为属…

android u盘检测工具,android USBU盘 接入检测

如果是在注册的静态广播一般必须含有以上的权限&#xff0c;这里必须注意添加如果在代码中注册广播则必须iFilter.addDataScheme("file")这样接受广播判断U盘public class RemovableDiskManagerReceiver extends BroadcastReceiver {public RemovableDiskManagerRece…

android 组合属性动画,Android属性动画组合(sequence串行、together并行)

在android中用原生api实现一系列复杂动画会很麻烦&#xff0c;所以对属性动画进行了一定封装&#xff0c;让使用起来更简单&#xff0c;能够按照人的思维依次编写动画。简单效果&#xff1a;使用方法&#xff1a;添加依赖&#xff1a;dependencies { compile"com.steven:A…

jta atomikos_带有Atomikos示例的Tomcat中的Spring JTA多个资源事务

jta atomikos在本教程中&#xff0c;我们将向您展示如何使用Atomikos Transaction Manager在Tomcat服务器中实现JTA多个资源事务。 Atomicos事务管理器为分布式事务提供支持。 这些是多阶段事务&#xff0c;通常使用多个数据库&#xff0c;必须以协调的方式提交。 分布式事务由…

android 音量键 广播,【Android 7.0 Audio】: 按键调节音量的调用过程

转载自http://blog..net/xiashaohua/article/details/53842337只简单描述调用过程&#xff0c;需对照代码看&#xff0c;不画图了&#xff0c;也不贴代码)1.在key Event处理部分&#xff0c;Phonewindow会捕获到音量按键事件&#xff0c;Phonewindow.onkeydown--MediaSessionLe…

台电+android+电话,通话系统_台电 G17s_平板电脑评测-中关村在线

通话系统将两张联通3G的SIM卡插入台电G17s之后&#xff0c;我们来感受一下它通话系统的使用是否令人满意。和一般的双卡Android手机平板一样&#xff0c;该机也不支持热插拔&#xff0c;需要将机器彻底关闭后插入SIM卡再开机。并且在开机后屏幕会弹出SIM卡信息&#xff0c;并询…

在Payara Server和GlassFish中配置密码

回答Stackoverflow问题可以为我发现我最喜欢的开源工具的正式文档中的空白提供很好的反馈。 我在这里回答的问题之一是如何在docker容器中更改Payara Server主密码 。 显然&#xff0c;在标准服务器安装中&#xff0c;这很简单–只需使用asadmin change-master-password命令&am…

功能Java示例 第2部分–讲故事

这是称为“ Functional Java by Example”的系列文章的第2部分。 我在本系列的每个部分中发展的示例是某种“提要处理程序”&#xff0c;用于处理文档。 在上一部分中&#xff0c;我从一些原始代码开始&#xff0c;并应用了一些重构来描述“什么”而不是“如何”。 为了帮助代…

OpenHub框架–下一个有趣的功能

这是有关OpenHub框架的系列文章中的第三篇&#xff0c;第一篇介绍OpenHub框架 &#xff0c;第二篇介绍异步消息传递模型 。 该系列的最后一篇文章将更详细地介绍其他一些有趣的功能&#xff0c;并说明为什么OpenHub可以成为您的集成项目的理想选择的原因。 节流 节流是一种功…

tcga癌症亚型获取_将亚型多态性与通用多态性相关联的危险

tcga癌症亚型获取Java 5已将通用多态性引入Java生态系统。 即使我们都知道由于泛型类型擦除及其后果而引起的无数警告&#xff0c;这还是对Java语言的重要补充。 通用多态性&#xff08;也称为参数多态性 &#xff09;通常与可能预先存在的亚型多态性正交。 一个简单的例子是co…

在生产中运行Java:SRE的观点

作为站点可靠性工程师 &#xff08;SRE&#xff09;&#xff0c;我确保我们的生产服务高效&#xff0c;可扩展且可靠。 典型的SRE是生产大师&#xff0c;必须对更广泛的体系结构有很好的了解&#xff0c;并精通许多更精细的细节。 SRE是会说多种语言的程序员&#xff0c;这是很…

android 退出多个activity,Android 中 退出多个activity的经典方法

1.使用list集合方式用list保存activity实例&#xff0c;然后逐一干掉import java.util.linkedlist;import java.util.list;import android.app.activity;import android.app.alertdialog;import android.app.application;import android.content.dialoginterface;import androi…

声明jpa批注处理器_如何使用反射基于JPA批注记录您的数据模型

声明jpa批注处理器因此&#xff0c;当您仅可以注释Java类时&#xff0c;使用JPA&#xff0c;Hibernate或EBeans很酷&#xff0c;但是您不是一直希望可以从代码“生成”数据模型的文档吗&#xff1f; 提取JPA / Hibernate和其他验证注释的信息&#xff1f; 假设您的bean中具有所…

在Grails战争中添加“精简” Groovy Web控制台

假设您已将Grails应用程序部署到服务器上–如何查找应用程序的配置方式&#xff1f; 如果您有来源&#xff0c;则可以查看Config.groovy &#xff0c; BuildConfig.groovy等&#xff08;在这种情况下&#xff0c;我正在谈论Grails 2应用程序&#xff0c;但是这些想法可以推广到…