2017-01-30 2 views
0

Я хочу дать пользователю возможность делать случайный или нечувствительный к регистру поиск.Lucene, как переключаться между чувствительным к регистру и регистрозависимым

Моя идея - использовать анализатор, чувствительный к регистру, для индексации данных, а затем использовать чувствительный или нечувствительный анализатор для поиска в зависимости от пользовательского ввода.

Так что я создал мой случай чувствительный анализатор и здесь просто мой код:

public final class CaseSensitiveStandardAnalyzer extends StopwordAnalyzerBase { 
    @Override 
    protected TokenStreamComponents createComponents(final String fieldName, final Reader reader) { 
    final StandardTokenizer src = new StandardTokenizer(matchVersion, reader); 
    src.setMaxTokenLength(maxTokenLength); 
    TokenStream tok = new StandardFilter(matchVersion, src); 
    tok = new StopFilter(matchVersion, tok, stopwords); 
    return new TokenStreamComponents(src, tok) { 
     @Override 
     protected void setReader(final Reader reader) throws IOException { 
     src.setMaxTokenLength(CaseSensitiveStandardAnalyzer.this.maxTokenLength); 
     super.setReader(reader); 
     } 
    }; 
    } 

Для индексирования я использовал это:

Analyzer analyzer = new CaseSensitiveStandardAnalyzer(Version.LUCENE_46); 
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46,analyzer); 
IndexWriter indexWriter = new IndexWriter(indexDir,config); 
indexWriter.addDocument(document); 

Для поиска я использовал:

Analyzer analyzer; 
if(caseSentive) 
    analyzer = new CaseSensitiveStandardAnalyzer(Version.LUCENE_46); 
else 
    analyzer = new StandardAnalyzer(Version.LUCENE_46); 
QueryParser queryParser = new QueryParser(Version.LUCENE_46,"content", analyzer); 
Query query = queryParser.parse(searchString); 
//Search 
TopDocs results = indexSearcher.search(query,10000); 
ScoreDoc[] hits = results.scoreDocs; 

Когда я устал от этого, чувствительный корпус работал, но нечувствительный случай этого не делал.

После более подробного исследования я обнаружил, что использование чувствительного к регистру анализатора с запросом на более низкий уровень обслуживания не будет работать. Интуитивно-зависимая анализатор, чувствительный к регистру, с зависящим от регистра запроса и нечувствительным к регистру анализатором индексированной работой с регистро-независимым запросом, может ли кто-нибудь подтвердить это?

Мне кажется, что единственный надежный способ поиска как чувствительного к регистру, так и нечувствительного к регистру - это индексировать дважды, по одному для каждого случая, это правильно?

ответ

0

Мне кажется, что единственный надежный способ поиска как чувствительного к регистру, так и без учета регистра - это индексировать дважды, по одному для каждого случая, это правильно?

Это было бы возможным решением, но есть более оптимальные решения для этого случая использования: https://stackoverflow.com/a/2490441/867816

Это может помочь, тоже: http://www.hascode.com/2014/07/lucene-by-example-specifying-analyzers-on-a-per-field-basis-and-writing-a-custom-analyzertokenizer/

Смежные вопросы