2017-01-30 190 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; 

当我厌倦这个时,这个敏感案例奏效了,但这个不敏感的案例并没有。

经过更多的研究,我发现使用小心谨慎的分析器与低关怀查询将无法正常工作。区分大小写的分析器索引工作区分大小写查询和不区分大小写的分析器索引与大小写不敏感的查询工作,任何人都可以证实这一点?

在我看来,搜索区分大小写和区分大小写的唯一可靠方法是索引两次,每种情况一次,这是正确的吗?

回答