Firstly, here is my Hibernate-Search indexing time setup:
// ...
@Indexed(index = "XXXRequestIndex")
@AnalyzerDef(name = "toLowercaseAnalyzer",
tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class)
})
public class XXXRequest implements Serializable {
// ...
@Field(analyze = Analyze.YES, store = Store.YES, analyzer = @Analyzer(definition = "toLowercaseAnalyzer"))
@SortableField
private String status;
// ...
}
I saw this thread where .overridesForField(...)
is setup on QueryBuilder
for a field at query time in order to query case-insensitive with wildcards:
Hibernate Search | ngram analyzer with minGramSize 1
I need to do something similar for a particular field only ("status"), but I am NOT using a QueryBuilder
, instead I am parsing an incoming lucene query string using an MultiFieldQueryParser
. I cannot change that to switch to build a query using a QueryBuilder
because it is important for the callers of the code to issue their own dynamic queries using the lucene query parser syntax (like described more or less in https://lucene.apache.org/core/2_9_4/queryparsersyntax.html)
So when the caller sends as lucene query status:*n\ Pr*
, it does not match "In Processing".
However a query like status:*n\ pr*
does match "In Processing".
My query code:
Analyzer analyzer = new KeywordAnalyzer();
String[] fields = ...
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
fields,
analyser);
Query luceneQuery = queryParser.parse(luceneFilterString);
List results = fullTextQuery.getResultList();
How can I make the query be case-insensitive?