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

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。

  

原文地址:https://www.cnblogs.com/huangfox/p/2550299.html