浏览 5227 次
锁定老帖子 主题:solr4.0索引文档原子更新特性的疑问
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-12-03
但似乎我遇到了新问题,我用的是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。 所以我想问,是不是有什么参数可以设置?有用过此功能的盆友还请帮我一把哈 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-12-03
额,改了源码,终于实现了
|
|
返回顶楼 | |
发表时间:2012-12-04
大哥,怎么改的啊?可以告诉我吗
|
|
返回顶楼 | |
发表时间:2012-12-04
看了solrj4.0的代码,应该是还不支持这项功能啊,我打算直接自己写xml提交请求了,楼主有其他更好的方法吗
|
|
返回顶楼 | |
发表时间:2012-12-04
你想保留原来的字段的话 在solr配置你那些字段没有值的时候给他默认值不可以吗??
|
|
返回顶楼 | |
发表时间: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方法,你可以去看下。 |
|
返回顶楼 | |
发表时间:2012-12-07
青春的、脚步 写道 你想保留原来的字段的话 在solr配置你那些字段没有值的时候给他默认值不可以吗??
额,这个我还没试过。可能也行吧。 但是solr里面的操作会去查询旧的文档,如果旧文档时null,则直接new了一个。最后调用lucene的updateDocument方法了,应该会先删除再插入吧。具体我也没试过 |
|
返回顶楼 | |