个人博客 地址:http://www.wenhaofan.com/article/20180921233809

问题描述

在使用deleteDocuments,updateDocument方法根据id字段删除更新索引时不抛异常但是删除更新失败

    writer.deleteDocuments(new Term("id", "1"));

解决问题

在创建索引时使用到了lucene提供的StoreField TextField,而id字段的属性的类型为StoreField,当出现该问题时首先切换思路尝试根据content删除索引。

writer.deleteDocuments(new Term("content", "html"));

果不其然,使用类型为TextField时便能正确的执行删除修改操作,但是由于TextField属性有一个特性 ,使用该类型的字段会被分词,这样便会出现一个问题。

假如我们使用TextFiled来存储了一个id为123的字段,一个id值为12的字段。

由于TextField类型的值会被分词,所以id值为123的文档可能会创建两个索引:12和123 ,id值为12的文档可能会创建一个索引:12     (实际情况或许不会如此,此处仅作演示)。

此时如果我们想要删除id值为12的文档,便很有可能同时删掉id值为123的文档,因为他们有一个共同的索引值12。

所以使用TextField来存储id值不是一个理想的解决方法,继续寻找其他的解决 方法。

现在问题的原因基本上能够锁定在StoreFiled和TextField的差异上,所以进一步分析问题原因,

最后通过阅读源码发现TextField设置了FieldType中的IndexOptions属性值为IndexOptions.DOCS_AND_FREQS_AND_POSITIONS,而StoredField中的FieldType并没有设置该属性

于是修改建立索引时id所使用的Filed,代码修改如下

Field idField=new Field("id", String.valueOf(article.getId()), type)

修改为

FieldType type = new FieldType();
type.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS);
type.setTokenized(false);
type.setStored(true);
Field idField=new Field("id", String.valueOf(article.getId()), type);

此处新建了一个不进行分词,IndexOptions属性值为IndexOptions.DOCS_AND_FREQS_AND_POSITIONS,且存储在查询结果中的FieldType,经测试 完美解决问题

最新文章

  1. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 密码强化、网络安全强化
  2. WinCE Show App Icon
  3. Unity扩展编辑器--类型3:Custom Editors
  4. cordova热更新
  5. java中转换json方式(JSONArray,JSONObject),json解析
  6. HTML入门知识
  7. Starting sshd: /var/empty/sshd must be owned by root and not group or world-writable.
  8. SQL语句整理
  9. CentOS7 安装中文输入法
  10. Stm32基础
  11. python信号量
  12. Eclipse建立Java工程中的三个JRE选项的区别(Use an execution environment JRE,Use a project specific JRE,Use default JRE)
  13. jQuery的文件引入、入口函数以及js对象和jquery对象之间的互相转换
  14. 2018.10.29 bzoj3718: [PA2014]Parking(树状数组)
  15. Java常用排序算法及性能测试集合
  16. sgu 183. Painting the balls 动态规划 难度:3
  17. FreeOpcUa compile
  18. Coxph model Pvalue Select2
  19. mysql数据表简单拷贝及重命名
  20. iOS 计算文字宽度的一个细节

热门文章

  1. C#实现的Check Password和锁定输错密码锁定账户
  2. #《Essential C++》读书笔记# 第三章 泛型编程风格
  3. java面向对象入门(3)-java构造方法
  4. JS DOM中getElement系列和querySelector系列获取节点
  5. Oracle v$session视图显示客户端IP地址
  6. 剑指offer-面试题60-n个骰子的点数-动态规划
  7. 【Java】基于RXTX的Java串口通信
  8. 从HTML到node.js以及跨域问题的解决
  9. 生成指定规模大小的redis cluster对关系
  10. Python学习记录(一):Anaconda3的安装、配置与使用