Я считаю, что StandardAnalyzer фактически удаляет «2» из «mvc2», оставляя индексированное слово равным «mvc».Я не уверен насчет SimpleAnalyzer, хотя.Вы можете попробовать использовать WhitespaceAnalyzer, который, я считаю, не удаляет числа.
Вы также должны обрабатывать вводимые данные таким же образом, как при индексировании.TermQuery - это «идентичное» совпадение, что означает, что если вы попытаетесь найти «mvc2», где фактические строки в вашем индексе всегда говорят «mvc», то совпадения не будет.
Я не нашел способа фактически использовать анализатор, если я не использую QueryParser, и даже тогда у меня всегда были странные результаты.
Вы можете попробовать это, чтобы «токенизировать» строку поиска втак же, как вы индексируете свой документ и выполняете логический И поиск по всем терминам:
// We use a boolean query to combine all prefix queries
var analyzer = new SimpleAnalyzer();
var query = new BooleanQuery();
using ( var reader = new StringReader( queryTerms ) )
{
// This is what we need to do in order to get the terms one by one, kind of messy but seemed to be the only way
var tokenStream = analyzer.TokenStream( "why_do_I_need_this", reader );
var termAttribute = tokenStream.GetAttribute( typeof( TermAttribute ) ) as TermAttribute;
// This will return false when all tokens has been processed.
while ( tokenStream.IncrementToken() )
{
var token = termAttribute.Term();
query.Add( new PrefixQuery( new Term( KEYWORDS_FIELD_NAME, token ) ), BooleanClause.Occur.MUST );
}
// I don't know if this is necessary, but can't hurt
tokenStream.Close();
}
Вы можете заменить PrefixQuery на TermQuery, если вы хотите только полные совпадения (PrefixQuery будет соответствовать любому, начинающемуся с "* ")