[ lucene FAQ ] Lucene QueryParser Exception : Encountered <EOF> at line *

本文探讨了在多线程环境下使用同一QueryParser对象时出现的Encountered&lt;EOF&gt;异常,并提供了两种解决方案:一是每个线程使用独立的QueryParser;二是使用同步的解析方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Encountered <EOF> 这个异常通常会出现在多线程并发使用同一个queryParser对象时发生。

可以通过以下实验进行验证。

static QueryParser parser;

	static {
		Analyzer a = new IKAnalyzer();
		parser = new QueryParser(Version.LUCENE_36, "f", a);
	}

@Override
	public void run() {
		long bt = System.currentTimeMillis();
		try {
			for (int i = 0; i < 100000; i++) {
				Query q = null;
				q = parser.parse("食品级达标全叶芦荟");
				// System.out.println(q);
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		long et = System.currentTimeMillis();
		System.out.println(et - bt);
	}

启动N个线程,一般刚开始就会排出这个异常。

解决办法一般有两个:

1.每个线程使用“独占”的queryparser对象,不进行公用。

2.公用queryparser对象,但提供一个同步的解析方式。

经过测试,方式二效率较低一点,10万次解析慢10s左右(需要考虑测试机器问题,本测试机器为pc机)。

不过方式二较易控制,且一定程度上减少GC。

 

 

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值