【发布时间】:2017-06-16 03:28:29
【问题描述】:
我想为用户提供区分大小写或不区分大小写搜索的选项。
我的想法是使用区分大小写的分析器来索引数据,然后根据用户输入使用敏感或不敏感的分析器进行搜索。
所以我创建了区分大小写的分析器,下面是我的一个简单代码:
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;
当我厌倦了这个时,敏感的情况下工作了,但不敏感的情况下没有。
经过更多研究,我发现将区分大小写的分析器与低关心查询一起使用是行不通的。区分大小写的分析器索引与区分大小写的查询一起使用,不区分大小写的分析器索引与不区分大小写的查询一起使用,有人可以确认吗?
在我看来,同时搜索区分大小写和不区分大小写的唯一可靠方法是索引两次,每种情况下一次,这样是否正确?
【问题讨论】:
标签: java search lucene full-text-search