We could potentially add a developer flag in the future if they want to flip the behavior. The behavior Bjorn is asking for has merit (as well as the current implementation).
Fix from Bjorn:
— C:\Users\xyt\AppData\Local\Temp\AnkhSVN\3179\QueryParser.27919.cs 20.04.2012 08:55:36
+++ C:_VS.NET\se\Lucene-2_9_4\core\QueryParser\QueryParser.cs 17.04.2012 12:25:02
/// <summary> Factory method for generating a query (similar to
/// <see cref="GetWildcardQuery" />). Called when parser parses an input term
/// token that uses prefix notation; that is, contains a single '*' wildcard
/// character as its last character. Since this is a special case
/// of generic wildcard term, and such a query can be optimized easily,
/// this usually results in a different query object.
/// Depending on settings, a prefix term may be lower-cased
/// automatically. It will not go through the default Analyzer,
/// however, since normal Analyzers are unlikely to work properly
/// with wildcard templates.
/// Can be overridden by extending classes, to provide custom handling for
/// wild card queries, which may be necessary due to missing analyzer calls.
/// <param name="field">Name of the field query will use.
/// <param name="termStr">Term token to use for building term for the query
/// (<b>without</b> trailing '*' character!)
/// <returns> Resulting <see cref="Query" /> built for the term
/// <exception cref="ParseException">throw in overridden method to disallow
public /protected internal/ virtual Query GetPrefixQuery(System.String field, System.String termStr)
if (!allowLeadingWildcard && termStr.StartsWith("*"))
throw new ParseException("'*' not allowed as first character in PrefixQuery");
termStr = termStr.ToLower();
- Term t = new Term(field, termStr);
+ Term t = null;
+ TermQuery q = null;
+ q = GetFieldQuery(field, termStr) as TermQuery;
+ catch(Exception ex)
+ if (q != null)
+ t = new Term(field, q.GetTerm().text);
+ t = new Term(field, termStr);