Lucene QueryParser需要适用于具有stopfilter和porterstemfilter的Custom Analyzer

Roh*_*nga 5 java lucene

使用QueryParser,stemfilter似乎不起作用,并且使用AnalyzingQueryParser,停止过滤器无效.

我的观察是否正确?如何解决这个问题呢?

更新 确定所以对代码进行了一些实验.AnalyzingQueryParser不允许使用stopfilter,QueryParser不允许使用模糊搜索进行porterstemmerfilter.

所以我需要一个QueryParser,它允许模糊搜索以及对porterstemfilter和stopfilter的支持.

wes*_*sen 0

如果需要,您可以通过子类化 QueryParser 来覆盖它。我能够毫无问题地将 StopAnalyzer 与 AnalyzingQueryParser 一起使用:

Analyzer analyzer1 = new StopAnalyzer(Version.LUCENE_30, ImmutableSet.of("foo", "bar", "blop"));
QueryParser qp = new AnalyzingQueryParser(Version.LUCENE_30, "field", analyzer1);
Query q = qp.parse("foobar foo bar blop hello");
System.out.println("query  " + q);

q = qp.parse("foobar~ foo~ bar~ hell~");
System.out.println("query  " + q);
Run Code Online (Sandbox Code Playgroud)

创建查询: field:foobar field:hello 和 field:foobar~0.5 hell~0.5 。这是 lucene 3.0.3,所以我不确定这是否适用于你当时的问题。不管怎样,我偶然发现了这一点,希望它能有所帮助。如果词干分析器添加通配符查询,您可能会遇到问题,在这种情况下您可能需要重写这些方法:

@Override
protected Query getFuzzyQuery(String field, String termStr, float minSimilarity) throws ParseException {
    return super.getFuzzyQuery(field, termStr, minSimilarity);
}

@Override
protected Query getWildcardQuery(String field, String termStr) throws ParseException {
    return super.getWildcardQuery(field, termStr);
}
Run Code Online (Sandbox Code Playgroud)