论坛首页 Java企业应用论坛

solr4.0索引文档原子更新特性的疑问

浏览 5182 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-12-03  
solr4.0支持了索引文档的原子更新,这让我们在更新索引时方便了不少。

但似乎我遇到了新问题,我用的是solr4+lucene4,客户端是solrj


SolrInputDocument doc = new SolrInputDocument();
doc.setField("goodsColorSn", "21116540");  //unique key
Map<String, Object> ky = new HashMap<String, Object>();
ky.put("set", "新关键字");
doc.addField("keyword", ky, 11);
doc.addField("cid", 1);
doc.addField("cid", 2);
doc.addField("cid", 3);


大致的代码是这样的,当旧索引中存在21116540这个文档时,更新成功。但是当原先的索引中不存在此文档,则会发生插入操作,而且新插入的文档只有以上设置的文档字段,而完整的文档会有十几个字段。这个操作其实类似于upsert,有则更新,无则插入,这不是我想要的,我想要的是update,没有insert。

所以我想问,是不是有什么参数可以设置?有用过此功能的盆友还请帮我一把哈 
   发表时间:2012-12-03  
额,改了源码,终于实现了
0 请登录后投票
   发表时间:2012-12-04  
大哥,怎么改的啊?可以告诉我吗
0 请登录后投票
   发表时间:2012-12-04  
看了solrj4.0的代码,应该是还不支持这项功能啊,我打算直接自己写xml提交请求了,楼主有其他更好的方法吗
0 请登录后投票
   发表时间:2012-12-04  
你想保留原来的字段的话  在solr配置你那些字段没有值的时候给他默认值不可以吗??
0 请登录后投票
   发表时间:2012-12-07  
zhairch 写道
大哥,怎么改的啊?可以告诉我吗


 if(!cmd.isOldNull) {
            	 Document luceneDocument = cmd.getLuceneDocument();
                 // SolrCore.verbose("updateDocument",updateTerm,luceneDocument,writer);
                 writer.updateDocument(updateTerm, luceneDocument,
                     schema.getAnalyzer());
            }
           

这个if判断就是我自己加的。因为solr的更新,是根据你的主键,查找旧文档,如果找到了,会copy其他你没有传值的字段,加上你传值的字段形成一个新的文档,然后调用lucene的update接口,线删除旧文档,然后插入新的。
solr里面,当根据你的主键,查找不到旧文档,会new一个,文档字段只有你传值的那些,所以会造成upsert局面,且字段丢失。
所以,我加了一个判断,当旧文档问空,则不执行这个更新操作。那么就是update了,不会insert。
package org.apache.solr.update.DirectUpdateHandler2
主要是这个文件的addDoc方法,你可以去看下。
0 请登录后投票
   发表时间:2012-12-07  
青春的、脚步 写道
你想保留原来的字段的话  在solr配置你那些字段没有值的时候给他默认值不可以吗??

额,这个我还没试过。可能也行吧。

但是solr里面的操作会去查询旧的文档,如果旧文档时null,则直接new了一个。最后调用lucene的updateDocument方法了,应该会先删除再插入吧。具体我也没试过
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics