【问题标题】:Apache Lucene QueryParser.parse not using Analyzer on FuzzyQueryApache Lucene QueryParser.parse 未在 FuzzyQuery 上使用分析器
【发布时间】:2019-06-11 02:06:02
【问题描述】:

使用 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

【问题讨论】:

    标签: java elasticsearch search lucene information-retrieval


    【解决方案1】:

    问题是,如果查询是 FuzzyQueryWildcardQuery, PrefixQuery, RegexpQuery

    为了解决这个问题,Lucene 提供了AnalyzingQueryParser 类,它覆盖了 Lucene 的默认 QueryParser,因此 Fuzzy-、Prefix-、Range- 和 WildcardQuery 也通过给定的分析器传递,但是通配符 * 和 ?不要从搜索字词中删除。

    但是,从 Lucene 7.4 开始,此功能是 mergedQueryParserBase,现在有适当的方法来处理这些查询,例如:

    protected Query getFuzzyQuery(String field,
                                  String termStr,
                                  float minSimilarity)
    

    因此,您应该创建 ComplexPhraseQueryParser 覆盖此方法并从此处调用 parse,而不是创建类 QueryParser

    【讨论】:

    • 非常感谢!它适用于 Lucene 4.0 中的 AnalyzingQueryParser 类。我试图弄清楚如何让解决方案在 Lucene 7.6 中工作,但没有结果。 QueryParser 扩展了 QueryParserBase 但仍然不解析 FuzzyQuery。在这种情况下,我应该创建自己的类来扩展 QueryParserBase 吗?
    猜你喜欢
    • 2015-07-30
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多