有关lucene的问题
1.异常:Lock obtain timed out: NativeFSLock
原因:没有及时关闭indexWriter或者indexReader,lucene进行读写的时候会在文件夹里面创建lock ,不关闭的话,lock一直存在,下次进行读写,就会出现该问题
解决方法:3.0以及3.0版本之前的,写入document之后,关闭indexWriter ,查询用到indexSearcher,查询结束之后需要关闭indexSearcher
3.0之后的,写入document之后,关闭indexWriter ,查询用到indexReader ,查询结束之后需要关闭indexReader
例:
private void closeIndexWriter(IndexWriter writer) {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (IndexWriter.isLocked(writer.getDirectory())) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
IndexWriter.unlock(writer.getDirectory());
}
writer = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
该方法需要放在外面,不然有可能在别的方法体内执行不了而没有关闭indexWriter
2.异常情况:
org.apache.lucene.search.BooleanQuery$TooManyClauses: maxClauseCount is set to 1024
at org.apache.lucene.search.BooleanQuery.add(BooleanQuery.java:165)
at org.apache.lucene.search.BooleanQuery.add(BooleanQuery.java:156)
at org.apache.lucene.search.RangeQuery.rewrite(RangeQuery.java:106)
原因:BooleanQuery用一个变量存储搜索字句 clauses 是一个List类型,同时使用另外一个变量限制其长度为1024 ,超过该数量,就会出现该异常。
比如,如果索引文档中包括条件 car 和 cars,那么使用 ca* 搜索之前,将被扩展成 car or cars。(查询字句的数目增大了,尤其是数据量较大,数据相似度较高,搜索条件较短的情况下这个出现的概率更高),这个条件列表的长度默认被限制在1024。当超出了1024的时候,就从上面的代码中抛出了异常。
解决方法:(1)、使用RangeFilter替换部分查询RangeQuery,但是效率会有影响;
(2)、设置默认长度值,BooleanQuery.setMaxClauseCount(),设置成10000,或者取消这个限制,BooleanQuery.setMaxClauseCount(Integer.MAX_VALUE).
如果设置过大,有可能会出现out of memory 错误。
(3)、针对个别特殊的字段进行一些优化,比如时间字段保留到yyyyMMdd位,以避免后面时分位带来的搜索条件的扩大。
3.异常:java.lang.IllegalArgumentException: A SPI class of type org.apache.lucene.codecs
.Codec with name 'Lucene41' does not exist. You need to add the corresponding JA
R file supporting this SPI to your classpath.The current classpath supports the
following names: [Lucene40, Lucene3x, SimpleText, Appending]
原因:索引文件版本为lucene4.1 而打开索引的代码版本只支持lucene4.0以及以下的
4.索引删除不掉
可能原因:(1)删除之后没有提交indexWriter或者是关闭indexWriter.(2)用term指定的域删除,而那个域没有被索引,比如说id,把该域索引进去或者换索引过的域进行删除即可。
5.按照某些域排序,排序结果不正常
可能原因:(1)该域被分词了,导致排序出现不科学的结果。可以将该域不分词,查询的时候将关键字按空格切割,然后循环建立query
注意:可以按照评分,然后再按照自己选择的域排序。sort数组元素顺序表示排序选项优先级从高到低
6.异常:EOF错误
原因:用特殊字符查询会导致错误,比如() [] {} ^ : /
解决方法:传入参数查询之前进行替换。
name.replaceAll("\\/", " ").replaceAll("\\(", " ").replaceAll("\\)", " ").replaceAll("\\:", " ").replaceAll("\\^", " ").replaceAll("\\[", " ").replaceAll("\\]", " ").replaceAll("\\{", " ").replaceAll("\\}", " ")
有关lucene的问题的更多相关文章
- lucene 基础知识点
部分知识点的梳理,参考<lucene实战>及网络资料 1.基本概念 lucence 可以认为分为两大组件: 1)索引组件 a.内容获取:即将原始的内容材料,可以是数据库.网站(爬虫).文本 ...
- 用lucene替代mysql读库的尝试
采用lucene对mysql中的表建索引,并替代全文检索操作. 备注:代码临时梳理很粗糙,后续修改. import java.io.File; import java.io.IOException; ...
- Lucene的评分(score)机制研究
首先,需要学习Lucene的评分计算公式—— 分值计算方式为查询语句q中每个项t与文档d的匹配分值之和,当然还有权重的因素.其中每一项的意思如下表所示: 表3.5 评分公式中的因子 评分因子 描 述 ...
- Lucene的分析资料【转】
Lucene 源码剖析 1 目录 2 Lucene是什么 2.1.1 强大特性 2.1.2 API组成- 2.1.3 Hello World! 2.1.4 Lucene roadmap 3 索引文件结 ...
- Lucene提供的条件判断查询
第一.按词条搜索 - TermQuery query = new TermQuery(new Term("name","word1"));hits = sear ...
- Lucene 单域多条件查询
在Lucene 中 BooleanClause用于表示布尔查询子句关系的类,包括:BooleanClause.Occur.MUST表示and,BooleanClause.Occur.MUST_NOT表 ...
- lucene自定义过滤器
先介绍下查询与过滤的区别和联系,其实查询(各种Query)和过滤(各种Filter)之间非常相似,可以这样说只要用Query能完成的事,用过滤也都可以完成,它们之间可以相互转换,最大的区别就是使用过滤 ...
- lucene+IKAnalyzer实现中文纯文本检索系统
首先IntelliJ IDEA中搭建Maven项目(web):spring+SpringMVC+Lucene+IKAnalyzer spring+SpringMVC搭建项目可以参考我的博客 整合Luc ...
- 全文检索解决方案(lucene工具类以及sphinx相关资料)
介绍两种全文检索的技术. 1. lucene+ 中文分词(IK) 关于lucene的原理,在这里可以得到很好的学习. http://www.blogjava.net/zhyiwww/archive/ ...
- MySQL和Lucene索引对比分析
MySQL和Lucene都可以对数据构建索引并通过索引查询数据,一个是关系型数据库,一个是构建搜索引擎(Solr.ElasticSearch)的核心类库.两者的索引(index)有什么区别呢?以前写过 ...
随机推荐
- Linux系统信息查看命令大全
系统# uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本# cat /proc/cpuinfo # 查看CPU信息# hostna ...
- putty配色方案
最近用腻了putty默认的配色方案,所以打算换一下配色. 使用的是修改注册表的方法. 1.打开注册表:运行——>regedit 2.找到对应的注册表文件,并导出:注册表地址 HKEY_CURRE ...
- mysql5.7.11编译安装以及修改root密码小结
系统是cenos6.7 64位的,默认mysql5.7.11下载到/usr/local/src,安装目录在/app/local/mysql目录下,mysql数据放置目录/app/local/data. ...
- Java Native Interface Specification
http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html http://www.ibm.com/develo ...
- Ubuntu terminal 不见了
Python出问题了,卸载Python后,terminal竟然消失了.. Ctrl + Alt + T出现的是XTerm 解决办法: 在XTerm中输入命令: # sudo apt-get insta ...
- phpmyadmin查看创建表的SQL语句
本人菜鸟 发现创建表的SQL语句还不会 直接phpmyadmin解决的 查看见表的语句除了直接到处SQL格式文件 打开查看外 就是执行语句查询 语句:show create table 表名 貌似大 ...
- Python-面向对象编程(一)
初识面向对象: Python中一切皆对象,我自己,我的电脑,电脑桌,都称之为一个对象.对象是类的一个实体. 我们可以通过行为和特征(属性)来描述一个对象,比如小狗,它有四条腿,一个尾巴,两个虎牙,这就 ...
- Python之路【第四篇】:模块
什么是模块: 模块就是一个功能的集合. 模块就和乐高积木差不多,你用这些模块组合出一个模型,然后也可以用这个模块加上其他的模块组合成一个新的模型 模块的种类: 1.内置模块(python自带的比如os ...
- NGINX将PHP带参数的URL地址重定向二级或多级域名访问
今天项目中有一个手机站点需要用*.m.domain.com的三级域名访问. 如手机站点的访问网址为m.domain.com,手机下面的会员实际访问地址为index.php?username=$user ...
- MySQL各版本的区别
文章出自:http://blog.sina.com.cn/s/blog_62b37bfe0101he5t.html 感谢作者的分享 MySQL 的官网下载地址:http://www.mysql.com ...