java - Apache Lucene QueryParser.parse 未在 FuzzyQuery 上使用分析器

标签 java elasticsearch search lucene information-retrieval

使用 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 无法正确解析查询(没有应用分析器),如果它们是 FuzzyQueryWildcardQueryPrefixQueryRegexpQuery

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

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

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

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

关于java - Apache Lucene QueryParser.parse 未在 FuzzyQuery 上使用分析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54226344/

相关文章:

java - 在 Windows cmd 中转义 jvm 参数

elasticsearch - Elasticsearch分析器配置

mysql - SQL 搜索名称并按最佳匹配排序

java - 如何调试 JPA CriteriaBuilder 查询

java - 通过 Java/Spring Boot 连接到 Docker Elasticsearch 实例

geolocation - 使用地理边界框过滤器对嵌套对象进行Elasticsearch渗滤

c - 比较大量整数对的快速方法是什么?

javascript - javascript中的search()方法无法在包含 "\\ch"的字符串中搜索它

java - android中变量的全局声明

Docker:将容器内写入的日志文件发送到 ELK 堆栈