Apache Lucene QueryParser.parse не использует Analyzer в FuzzyQuery - PullRequest
0 голосов
/ 17 января 2019

С помощью 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

1 Ответ

0 голосов
/ 17 января 2019

Проблема в том, что долгое время QueryParser не обрабатывал запросы должным образом (не применял анализаторы), если они были FuzzyQuery , WildcardQuery, PrefixQuery , RegexpQuery

Для решения этой проблемы у Lucene был класс AnalyzingQueryParser , который переопределяет QueryParser по умолчанию Lucene, так что Fuzzy-, Prefix-, Range- и WildcardQuerys также проходят через данный анализатор, но с подстановочными символами * и ? не удаляться из условий поиска.

Однако, начиная с Lucene 7.4, эта функциональность была объединена в QueryParserBase , которые теперь имеют соответствующие методы для обработки этих запросов, например:

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

Таким образом, вместо создания класса QueryParser, вы должны создать ComplexPhraseQueryParser, который переопределяет этот метод, и вызывать parse отсюда.

...