解决lucene更新删除无效的问题
个人博客 地址: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,经测试 完美解决问题
解决lucene更新删除无效的问题的更多相关文章
- word中几个好用的宏代码(立方米上标、关闭样式自动更新、删除无效样式、表格加粗边框、宋体引号)
Sub 替换立方米() With Selection.Find .Text = "m3" .Replacement.Text = "mm3" .Forward ...
- cad.net 复制图元的时候按下多次esc导致复制中断的bug,令REGEN,REGENALL更新图元无效.
浩辰没有这个bug !!!!!!! 如上述动图所示,cad在复制一个多图元的操作时候,多次按下esc键中断复制操作, **注意例子要有足够多的图元(大概一万个图元),才能很好展示这个bug,而且这个b ...
- TODO:MongoDB的查询更新删除总结
TODO:MongoDB的查询更新删除总结 常用查询,条件操作符查询,< .<=.>.>=.!= 对应 MongoDB的查询操作符是$lt.$lte.$gt.$gte.$ne ...
- 虚拟机安装 ubuntu 后,更新源无效,以及无法联网安装软件的问题
问题: 虚拟机安装 ubuntu 后,更新源无效,以及无法联网安装软件: 错误提示: Err http://security.ubuntu.com/ubuntu/ trusty-security/un ...
- 我的MYSQL学习心得(八) 插入 更新 删除
我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...
- paip.解决access出现 -2147467259 无效的参数量
paip.解决access出现 -2147467259 无效的参数量 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http: ...
- JQuery对ASP.NET MVC数据进行更新删除
以前学习ASP.NET MVC时,学习与应用,操作过数据显示,添加,编辑,更新和删除等功能. 很多方法是相通的,看自己是怎样来进行方便,快捷,高效率. 今天Insus.NET写的练习,是直接对绑定在T ...
- 解决ReSharper自动删除换行
使用Devexpress+ReSharper进行开发,似乎是C/S开发的最佳搭配. 但在ReSharper使用时,发现一个非常烦人的问题:即按F5进行调试时,自动删除换行,这样不仅把代码搞乱了,而且有 ...
- PHP中Cookie的使用---添加/更新/删除/获取Cookie 及 自动填写该用户的用户名和密码和判断是否第一次登陆
PHP中Cookie的使用---添加/更新/删除/获取Cookie 及 自动填写该用户的用户名和密码和判断是否第一次登陆 什么是cookie 服务器在客户端保存用户的信息,比如登录名,密码等 这些数 ...
随机推荐
- 【React Native错误集】* What went wrong: Execution failed for task ':app:installDebug'.
错误1:* What went wrong: Execution failed for task ':app:installDebug'. > com.android.builder.testi ...
- mysql必知必会--使用数据处理函数
函数 与其他大多数计算机语言一样,SQL支持利用函数来处理数据.函数 一般是在数据上执行的,它给数据的转换和处理提供了方便. 在前一章中用来去掉串尾空格的 RTrim() 就是一个函数的例子 函数没有 ...
- kuangbin专题 专题九 连通图 POJ 3177 Redundant Paths
题目链接:https://vjudge.net/article/371?tdsourcetag=s_pcqq_aiomsg 题目:给定一个连通图,题目说,任意两个点至少有一条路线可以相互到达, 为保证 ...
- textarea输入文字限制个数
说明: w-count固定为数字部分的class textarea-active为超出最大输入文字个数报错信息的class html 部分: <div class="wrap wrap ...
- node中 package.json 文件说明
1.概述 每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据).npm install命令根据这个配置文 ...
- [SDOI2018]反回文串
题意 问有多少个长度为\(N\)且字符集大小为\(K\)的字符串可以通过回文串旋转 (把第一个字符移到最后)若干次得到.\(K\le N≤10^{18}\) 做法 ARC64F的加强版 设\(h(d) ...
- Java之CheckedException
先来科普一下 CE 到底是什么吧.Java 要求你必须在函数的类型里面声明它可能抛出的异常.比如,你的函数如果是这样: void foo(string filename) throws FileNot ...
- sbt package报错:a bytes-like object is required, not 'str'
Traceback (most recent call last): File , in <module> s.sendall(content) TypeError: a bytes-li ...
- H5解决active伪类失效---点击后背景效果
<body ontouchstart></body> 给body注册一个空事件即可
- jQuery笔记(三)jQuery中的事件
; padding:0;} body { font-size:13px; line-height:130%; padding:60px;} #panel { width:300px; border:1 ...