Apache Lucene QueryParser.parse 未在 FuzzyQuery 上使用分析器
Apache Lucene QueryParser.parse not using Analyzer on FuzzyQuery
通过 TermQuery 和 PhraseQuery,我的 SerbianAnalyzer 被调用,但 FuzzyQuery 没有。我尝试使用具有相同行为的 lucene 4 和 lucene 7。
我有以下代码:
Query query;
String field = "text";
String value = "дањ";
QueryParser queryParser = new QueryParser(field, new SerbianAnalyzer());
System.out.println("\nTermQuery");
query = new TermQuery(new Term(field, value));
System.out.println("Query (preParse): " + (TermQuery)query);
System.out.println("Query.toString(field1): " + ((TermQuery)query).toString(field));
System.out.println("Query (afterParse): " + queryParser.parse(((TermQuery)query).toString(field)));
System.out.println("\nPhraseQuery");
String[] terms = value.split(" ");
query = new PhraseQuery(field, terms);
System.out.println("Query (preParse): " + ((PhraseQuery)query));
System.out.println("Query.toString(field1): " + ((PhraseQuery)query).toString(field));
System.out.println("Query (afterParse): " + queryParser.parse(((PhraseQuery)query).toString(field)));
System.out.println("\nFuzzyQuery");
query = new FuzzyQuery(new Term(field, value), 1);
System.out.println("Query (preParse): " + ((FuzzyQuery)query));
System.out.println("Query.toString(field1): " + ((FuzzyQuery)query).toString(field));
System.out.println("Query (afterParse): " + queryParser.parse(((FuzzyQuery)query).toString(field)));
我得到的结果是:
TermQuery Query (preParse): text:дањ
Query.toString(field): дањ
Query (afterParse): text:danj
PhraseQuery Query (preParse): text:"дањ"
Query.toString(field): "дањ"
Query (afterParse): text:danj
FuzzyQuery Query (preParse): text:дањ~1
Query.toString(field): дањ~1
Query (afterParse): text:дањ~1
问题是,很长一段时间 QueryParser 没有正确解析查询(没有应用分析器)如果它们是 FuzzyQuery, WildcardQuery, PrefixQuery, RegexpQuery
为了解决这个问题,Lucene AnalyzingQueryParser class 覆盖了 Lucene 的默认 QueryParser,以便 Fuzzy-、Prefix-、Range- 和 WildcardQuery 也通过给定的分析器传递,但是通配符 * 和 ?不要从搜索字词中删除。
但是,从 Lucene 7.4 开始,此功能 merged 变为 QueryParserBase,后者现在具有处理这些查询的适当方法,例如:
protected Query getFuzzyQuery(String field,
String termStr,
float minSimilarity)
因此,与其创建 class QueryParser
,不如创建 ComplexPhraseQueryParser
覆盖此方法并从此处调用解析。
通过 TermQuery 和 PhraseQuery,我的 SerbianAnalyzer 被调用,但 FuzzyQuery 没有。我尝试使用具有相同行为的 lucene 4 和 lucene 7。 我有以下代码:
Query query;
String field = "text";
String value = "дањ";
QueryParser queryParser = new QueryParser(field, new SerbianAnalyzer());
System.out.println("\nTermQuery");
query = new TermQuery(new Term(field, value));
System.out.println("Query (preParse): " + (TermQuery)query);
System.out.println("Query.toString(field1): " + ((TermQuery)query).toString(field));
System.out.println("Query (afterParse): " + queryParser.parse(((TermQuery)query).toString(field)));
System.out.println("\nPhraseQuery");
String[] terms = value.split(" ");
query = new PhraseQuery(field, terms);
System.out.println("Query (preParse): " + ((PhraseQuery)query));
System.out.println("Query.toString(field1): " + ((PhraseQuery)query).toString(field));
System.out.println("Query (afterParse): " + queryParser.parse(((PhraseQuery)query).toString(field)));
System.out.println("\nFuzzyQuery");
query = new FuzzyQuery(new Term(field, value), 1);
System.out.println("Query (preParse): " + ((FuzzyQuery)query));
System.out.println("Query.toString(field1): " + ((FuzzyQuery)query).toString(field));
System.out.println("Query (afterParse): " + queryParser.parse(((FuzzyQuery)query).toString(field)));
我得到的结果是:
TermQuery Query (preParse): text:дањ
Query.toString(field): дањ
Query (afterParse): text:danj
PhraseQuery Query (preParse): text:"дањ"
Query.toString(field): "дањ"
Query (afterParse): text:danj
FuzzyQuery Query (preParse): text:дањ~1
Query.toString(field): дањ~1
Query (afterParse): text:дањ~1
问题是,很长一段时间 QueryParser 没有正确解析查询(没有应用分析器)如果它们是 FuzzyQuery, WildcardQuery, PrefixQuery, RegexpQuery
为了解决这个问题,Lucene AnalyzingQueryParser class 覆盖了 Lucene 的默认 QueryParser,以便 Fuzzy-、Prefix-、Range- 和 WildcardQuery 也通过给定的分析器传递,但是通配符 * 和 ?不要从搜索字词中删除。
但是,从 Lucene 7.4 开始,此功能 merged 变为 QueryParserBase,后者现在具有处理这些查询的适当方法,例如:
protected Query getFuzzyQuery(String field,
String termStr,
float minSimilarity)
因此,与其创建 class QueryParser
,不如创建 ComplexPhraseQueryParser
覆盖此方法并从此处调用解析。