solr4.x之原子更新
solr4.x发布以后,最值得人关注的一个功能,就是原子更新功能,传说的solr是否能真正的做到像数据库一样,支持单列更新呢? 在solr官方的介绍中,原子更新是filed级别的更新,不会涉及整个Documnet级别的更新,但事实真是如此吗,经散仙验证,并非如此,原子更新这种功能,在Lucene层面上,就否定了这种方式,因为是索引存储结构,决定了它的更新方式,在Lucene中我们想更新一条数据怎么办?
很简单,删除原来的数据,在添加一条数据进去,那么假如,我们只更新了某一个字段呢,也要删除整条数据,重新添加?
没错,事实就是这样,严格来说,在Lucene索引中,并不存在更新删除一说,即使是删除,也是伪删除,临时打一个删除标签,在下次索引合并时,会清理掉标记的标签,Lucene的索引存储结构与HDFS的的结构从某种程度上来说,是相似的,仅仅支持Append操作。
那么如何验证原子更新,到底是不是真的是原子更新呢,这个很好办,我们只需要关注更新后的doc的docid有没有变化,即可验证,为什么这样讲?
在lucene里每个doc都有一个唯一的docid,默认情况下docid,是自增的,每增加一行数据,docid就会新增一个,删除后的docid,在下次merge的时候,会重置倒排表docid顺序,这个docid与Oracle的rownum伪列是非常类似的。
不过话说回来,虽然原子更新功能只是一个华而不实的功能,但是solr对其进行了封装,这样以来使得我们操作solr更加容易和方便,下面介绍下在solr中原子更新的内容,和使用方式。
原子更新注意事项:
1,想支持原子更新的field,必须存储(store=true),否则,使用将会出现问题
2,需要在solrconf.xml配置<updateLog/>,这一点默认就已经不配置了,也就是说我们只需要记住原子更新的域需要存储即可。
原子更新支持的操作:
1,set操作,是指对单,多值域的一种更新(覆盖操作)
2,add操作,仅多多值域生效,给多值域添加一个内容
3,inc操作,对数值域进行一次自增操作,举个例子,原来的值是,10,这次
你inc=3,那么更新后的值就是13
在本文,散仙只介绍,以solrj的操作方式,如果想详细了解更多其他方式,比如json或xml的方式,请点击此处
具体的核心代码如下:
- /**
- * 原子更新方式
- * */
- public static void atomUpdate1Store()throws Exception{
- SolrInputDocument sd = new SolrInputDocument();
- sd.addField("id", "1");//根据id唯一标识
- HashMap<String,String> map=new HashMap<String, String>();
- map.put("add", "国际1");//放入支持的操作,对多值域管用
- //map.put("set", "国际1");//放入支持的操作,对单值和多值域管用
- //map.put("inc", "国际1");//放入支持的操作,对数值域管用
- sd.addField("dname", map);
- server.add(sd);
- server.commit();
- System.out.println("原子更新成功!");
- }
solr4.x之原子更新的更多相关文章
- solr的原子更新/局部更新
solr支持三种类型的原子更新: set - to set a field. add - to add to a multi-valued field. inc - to increment a fi ...
- solr/solrj原子更新
lucene原子更新自己不用多介绍,但solr它的包装,下面是一个简单的介绍是:这个操作是用于索引非常有用. 详细在代码中使用例如以下: /** * 原子更新方式 * */ public static ...
- [Java] 集合框架原理之二:锁、原子更新、线程池及并发集合
java.util.concurrent 包是在 Java5 时加入的,与 concurrent 的相关的有 JMM及 AbstractQueuedSynchronizer (AQS),两者是实现 c ...
- Solr搜索引擎【索引提交、事务日志、原子更新】
一.索引提交 当一个文档被添加到Solr中,但没有提交给索引之前,这个文档是无法被搜索的.换句话说,从查询的角度看,文档直到提交之后才是可见的.Solr有两种类型的提交:软提交和正常提交[也称硬提交] ...
- AtomicIntegerFieldUpdater字段原子更新类
本文链接:https://blog.csdn.net/anLA_/article/details/78662383前面讲的两个AtomicInteger和AtomicIntegerArray,这两个都 ...
- 【记录】【solr】solr7.2.1原子更新
就是说只更新指定的字段,没有的字段则添加,有的字段则替换,没有指定更新的字段不会被删除 原来的数据只有id和name这两个字段 java操作,更新一个字段,id用于指定数据 结果,name字段没有被删 ...
- Java原子属性更新器AtomicReferenceFieldUpdater的使用
AtomicReferenceFieldUpdater是基于反射的工具类,用来将指定类型的指定的volatile引用字段进行原子更新,对应的原子引用字段不能是private的.通常一个类volatil ...
- ENode框架Conference案例分析系列之 - 复杂情况的读库更新设计
问题背景 Conference案例,是一个关于在线创建会议(类似QCon这种全球开发者大会).在线管理会议位置信息.在线预订某个会议的位置的,这样一个系统.具体可以看微软的这个项目的主页:http:/ ...
- MongoDB 文档的更新操作
在MongoDB中,更新单个doc的操作是原子性的.默认情况下,如果一个update操作更新多个doc,那么对每个doc的更新是原子性的,但是对整个update 操作而言,不是原子性的,可能存在前面的 ...
随机推荐
- a 标签解决,新窗口打开跨域问题
<a href="https://xxxx.vip/home" rel="nofollow noreferrer" target="_blank ...
- WinFrom调试时,弹出你正在调试发布的版本
把下图这里改成DEBUG就好 还有项目属性里面也要改一下 问题解决!
- python open和file的区别
opne和file都是用来对文件的操作 open:内置函数,使用方式是open('file_name', mode, buffering),返回值是一个file对象,以写模式打开文件如果不存在会被创建 ...
- DZY Loves Math系列
link 好久没写数学题了,再这样下去吃枣药丸啊. 找一套应该还比较有意思的数学题来做. [bzoj3309]DZY Loves Math 简单推一下. \[\sum_{i=1}^n\sum_{j=1 ...
- test20190324 树
题意 树(tree.cpp/c/pas) [题目背景] 这道题标算在评测机上的时间约为自己电脑的2/3 [问题描述] [输入格式] 共 n+2 行.第 1 行 1 个数,n. 后面 2-n 行,每行两 ...
- Eclipse+Spring学习(一)环境搭建(转)
最近由于投了一家公司实习,他要java工程师,而我大学3年的精力都花到了ASP.NET和前端上面,到找工作的时候才发现大公司不要.NET的,所以马上转型java...由于网上的高手都不屑于写这类文章, ...
- Linux 性能工具安装部署
docker 一.运行docker Linux内核版本需要在3.8以上,针对centos6.5 内核为2.6的系统需要先升级内核.不然会特别卡 在yum的ELRepo源中,有mainline(4.5) ...
- 使用fiddler进行genymotion安卓虚拟机手机抓包
1.首先先下载fiddler,这个直接百度就有啦. 2.打开fiddler ,可以看到这个界面还是挺帅的: 3.选择Tools - Fiddler Options -Https选项卡将配置设置为如下: ...
- Eclipse相对路径
Eclipse将java源文件存于src文件夹,而编译生成的class文件存于bin目录下,故以下代码输出的结果为false public class FileTest { public static ...
- VS起始页不显示最近使用的项目解决方案
前段时间换了一家公司,做ASP.NET开发,让我郁闷的是VS的起始页总是不显示最近使用项目,起先没在意,后来觉得越来越不方便了,然后本着内事不决问百度,外事不决问谷歌的态度,我就百了下~,结果还真遇到 ...