前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Lucene索引数据异常

Lucene索引数据异常

作者头像
幽鸿
发布于 2020-04-02 09:48:02
发布于 2020-04-02 09:48:02
73000
代码可运行
举报
运行总次数:0
代码可运行

最近突然发现本站的全文检索功能失效了,在本地进行调试,发现抛出 TokenStream contract violation异常,很奇怪的异常,因为之前本功能是好好的,也没改动,并且我也没使用TokenStream,异常如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Exception in thread "main" java.lang.IllegalStateException: TokenStream contract violation: 
    reset()/close() call missing, reset() called multiple times, or subclass does not call
    super.reset(). Please see Javadocs of TokenStream class for more information about the 
correct consuming workflow.
	at org.apache.lucene.analysis.Tokenizer$1.read(Tokenizer.java:110)
	at java.io.BufferedReader.fill(BufferedReader.java:154)
	at java.io.BufferedReader.read(BufferedReader.java:175)
	at java.io.FilterReader.read(FilterReader.java:65)
	at java.io.PushbackReader.read(PushbackReader.java:90)
	at com.chenlb.mmseg4j.MMSeg.readNext(MMSeg.java:42)
	at com.chenlb.mmseg4j.MMSeg.next(MMSeg.java:64)
	at com.chenlb.mmseg4j.analysis.MMSegTokenizer.incrementToken(MMSegTokenizer.java:64)
	at org.apache.lucene.index.DocInverterPerField.processFields(DocInverterPerField.java:102)
	at org.apache.lucene.index.DocFieldProcessor.processDocument(DocFieldProcessor.java:248)
	at org.apache.lucene.index.DocumentsWriterPerThread.updateDocument(DocumentsWriterPerThread.java:253)
	at org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:453)
	at org.apache.lucene.index.IndexWriter.updateDocument(IndexWriter.java:1520)
	at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1190)
	at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1171)
	at blog.test.TxtFileIndexer.main(TxtFileIndexer.java:52)

   仔细观察代码,发现最近确实没有改动这块代码。但是搜索功能为什么会报错了呢?观察maven依赖发现:

   原来我之前使用的是Lucene 4.6,现在改用maven管理后,而引进mmseg4j-analysis-1.9.1分词器后,默认引入了lucene 4.3的依赖包,

这就导致了Lucene在分词的时候抛出异常。解决办法也很简单,排除多余的Lucene包就可以了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	    com.chenlb.mmseg4j
	    mmseg4j-analysis
	    1.9.1
	    
	    	
	    		lucene-core
	    		org.apache.lucene
	    	
	    	
	    		lucene-queryparser
	    		org.apache.lucene

    但是修改后,发现报错依旧,这下不得不深究了,原来MMSeg4j 1.9.1的分词器有个bug,观察源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MMSegTokenizer.java

public void reset() throws IOException {
		//lucene 4.6
		//org.apache.lucene.analysis.Tokenizer.setReader(Reader)
		//setReader 自动被调用, input 自动被设置。
		super.reset();   //加这一句
		mmSeg.reset(input);
	}

    其实只要进行reset即可,这是Lucene高版本之后,MMSeg的一个bug,但是MMSeg后来都没更新了,导致没有较新的MMSeg版本了。所以需要重新下载MMSeg 4j源码并进行重新编译,打成本地jar,添加到Maven依赖库中,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	    com.chenlb.mmseg4j  
	    mmseg4j-analysis  
        1.9.2  
        system  
        D:\MyJava\BlogV3\src\main\webapp\WEB-INF\lib\mmseg4j-analysis-1.9.2.jar 
	 
	  
	    com.chenlb.mmseg4j  
	    mmseg4j-core  
        1.9.1  
        system  
        D:\MyJava\BlogV3\src\main\webapp\WEB-INF\lib\mmseg4j-core-1.9.1.jar 

    这下,重新编译打包发布即可,问题搞定。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大数据组件:Lucene全文索引与搜索
Lucene是一款高性能、可扩展的信息检索工具库,是用于全文检索和搜寻的Java开放源码程序库,最初是由Doug Cutting所撰写,2000年发行了第一个开源版本,2005年成为Apache顶级项目。虽然经过近20年,Lucene在全文检索领域还是独领风骚,蓬勃发展。
Yiwenwu
2024/05/25
4010
大数据组件:Lucene全文索引与搜索
Apache Lucene全局搜索引擎入门教程
Lucene搜索的API类主要有4个 IndexSearch,Query,QueryParser,Hits
SmileNicky
2019/01/17
2.8K0
后端技术杂谈3:Lucene基础原理与实践
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Java技术江湖
2019/12/09
6850
后端技术杂谈3:Lucene基础原理与实践
Lucene全文检索
全文检索是程序开发中非常重要的一个应用,今天带大家来一起学习Java基于Lucene的全文检索机制。 全文检索的概念 1) 从大量的信息中快速、准确地查找出要的信息。 2) 搜索的内容是文本信息(不是多媒体)。 3) 搜索的方式:不是根据语句的意思进行处理。如果要搜索的文本为"西安",那么含有这些词(西安程序员、西安)就能搜索出来。每一个词都是关键词。 4) 全面、快速、准确是衡量全文检索系统的关键指标。 5) 概括: a) 只处理文本。 b) 不处理语义。 a) 搜索时英文不区分大小写。 b) 结果列表
南风
2018/07/02
1.5K0
Lucene的全文检索学习
Lucene的官方网站(Apache的顶级项目):http://lucene.apache.org/
别先生
2019/10/13
9800
lucene实例与源码解析
全文检索的引擎工具包,实现了全文检索的类库。 全文检索,将查询的目标对象提取出来构造一套索引,查询索引得到数据结果。
Tim在路上
2020/08/04
1.4K0
Lucene.net(4.8.0) 学习问题记录二: 分词器Analyzer中的TokenStream和AttributeSource
前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移。因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3.6.0 ,PanGu分词也是对应Lucene3.6.0版本的。不过好在Lucene.net 已经有了Core 2.0版本,4.8.0 bate版,而PanGu分词,目前有人正在做,貌似已经做完,只是还没有测试~,Lucene升级的改变我都会加粗表示。 Lucene.net 4.8.0    https://g
ShenduCC
2018/04/27
1.1K0
Lucene demo演示搜索查询歌手,歌名,歌词
oktokeep
2024/10/09
700
Lucene demo演示搜索查询歌手,歌名,歌词
day65_Lucene学习笔记
注意由于语言不同分析器的切分规则也不同,本例子使用StandardAnalyzer,它可以对用英文进行分词。 如下是org.apache.lucene.analysis.standard.standardAnalyzer的部分源码:
黑泽君
2018/12/12
9200
day65_Lucene学习笔记
大数据ELK(四):Lucene的美文搜索案例
在资料中的文章文件夹中,有很多的文本文件。这里面包含了一些非常有趣的软文。而我们想要做的事情是,通过搜索一个关键字就能够找到哪些文章包含了这些关键字。例如:搜索「hadoop」,就能找到hadoop相关的文章。
Lansonli
2021/10/11
5280
大数据ELK(四):Lucene的美文搜索案例
Lucene.net(4.8.0) 学习问题记录五: JIEba分词和Lucene的结合,以及对分词器的思考
前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移。因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3.6.0 ,PanGu分词也是对应Lucene3.6.0版本的。不过好在Lucene.net 已经有了Core 2.0版本(4.8.0 bate版),而PanGu分词,目前有人正在做,貌似已经做完,只是还没有测试~,Lucene升级的改变我都会加粗表示。 Lucene.net 4.8.0    https://
ShenduCC
2018/04/27
2.3K0
Lucene就是这么简单
什么是Lucene?? Lucene是apache软件基金会发布的一个开放源代码的全文检索引擎工具包,由资深全文检索专家Doug Cutting所撰写,它是一个全文检索引擎的架构,提供了完整的创建索引和查询索引,以及部分文本分析的引擎,Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎,Lucene在全文检索领域是一个经典的祖先,现在很多检索引擎都是在其基础上创建的,思想是相通的。 Lucene是根据关健字来搜索的文本搜
Java3y
2018/04/02
9970
Lucene就是这么简单
Lucene笔记一
这里使用的是lucene-4.4.0版本,入门代码所需jar包如下图所示(解压lucene-4.4.0后的目录):
HUC思梦
2020/09/03
7760
Lucene笔记一
SSM(二)Lucene全文检索
这个项目是基于之前使用IDEA搭建的SSM的基础上进行增加的,建议小白先看下一我。上一篇博客,以及共享在Github上的源码。 以下是Lucene所需要的依赖:
crossoverJie
2022/08/19
3020
SSM(二)Lucene全文检索
Lucene.net(4.8.0) 学习问题记录一:分词器Analyzer的构造和内部成员ReuseStategy
前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移。因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3.6.0 ,PanGu分词也是对应Lucene3.6.0版本的。不过好在Lucene.net 已经有了Core 2.0版本,4.8.0 bate版,而PanGu分词,目前有人正在做,貌似已经做完,只是还没有测试~,Lucene升级的改变我都会加粗表示。 Lucene.net 4.8.0    https://g
ShenduCC
2018/04/27
8920
Lucene全文检索技术
百度、360搜索、谷歌、搜狗 2. 站内搜索 论坛搜索、微博、文章搜索 3. 电商搜索 淘宝搜索,京东搜索 4. 只要是有搜索的地方就可以使用全文检索技术。
不愿意做鱼的小鲸鱼
2022/09/24
7200
Lucene全文检索技术
深度解析 Lucene 轻量级全文索引实现原理
适用于需要数据索引量不大的场景,当索引量过大时需要使用ES、Solr等全文搜索服务器实现搜索功能。
2020labs小助手
2021/07/20
6350
javaweb-Lucene-1-61
Lucene是一个基于Java开发全文检索工具包。 就是将不规范的文档的内容单词进行分割,建立单词-文档索引,这样查询某个单词内容时可以通过索引快速查找相关文档,内容 对于一些网站内部的内容检索有需要 这项技术其实有更成熟的封装,比如专门的服务器等,这里只是普及一下相关概念,后面会解释进行其他的基于lucene的上层封装的相关技术 工程:https://github.com/Jonekaka/javaweb-Lucene-1-61
全栈程序员站长
2021/05/19
7540
Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息
在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从TokenStream流中获取.
全栈程序员站长
2022/09/15
4080
ICTCLAS用的字Lucene4.9捆绑
它一直喜欢的搜索方向,虽然无法做到。但仍保持了狂热的份额。记得那个夏天、这间实验室、这一群人,一切都随风而逝。踏上新征程。我以前没有自己。面对七三分技术的商业环境,我选择了沉淀。社会是一个大机器,我们只是一个小螺丝钉。我们不能容忍半点扭扭捏捏。
全栈程序员站长
2022/07/05
4960
相关推荐
大数据组件:Lucene全文索引与搜索
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验