陋室铭
永远也不要停下学习的脚步(大道至简至易)

posts - 2169,comments - 570,views - 413万

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的方式,请点击此处

具体的核心代码如下:

Java代码  收藏代码
    1. /** 
    2.  * 原子更新方式 
    3.  * */  
    4. public static void atomUpdate1Store()throws Exception{  
    5.     SolrInputDocument sd = new SolrInputDocument();  
    6.     sd.addField("id", "1");//根据id唯一标识  
    7.     HashMap<String,String> map=new HashMap<String, String>();  
    8.     map.put("add", "国际1");//放入支持的操作,对多值域管用  
    9.     //map.put("set", "国际1");//放入支持的操作,对单值和多值域管用  
    10.     //map.put("inc", "国际1");//放入支持的操作,对数值域管用  
    11.     sd.addField("dname", map);  
    12.     server.add(sd);  
    13.     server.commit();  
    14.     System.out.println("原子更新成功!");  
    15. }  
posted on   宏宇  阅读(233)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2017-08-10 N卡控制面板把physx设置为cpu
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示