[英]Lucene how to switch between case sensitive and case insensitive
我想让用户可以选择区分大小写或不区分大小写的搜索。
我的想法是使用区分大小写的分析器对数据建立索引,然后根据用户的输入使用敏感或不敏感的分析器进行搜索。
因此,我创建了区分大小写的分析器,这是我的简单代码:
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;
当我对此感到厌倦时,敏感的案例起作用了,但是不敏感的案例却没有。
经过更多研究后,我发现将区分大小写的分析器与较低关注度的查询结合使用是行不通的。 区分大小写的分析器索引可以与区分大小写的查询一起使用,而区分大小写的分析器索引可以与不区分大小写的查询一起使用,有人可以确认吗?
在我看来,搜索区分大小写和不区分大小写的唯一可靠方法是索引两次,每种情况一次,这是正确的吗?
在我看来,搜索区分大小写和不区分大小写的唯一可靠方法是索引两次,每种情况一次,这是正确的吗?
那将是一个可能的解决方案,但是针对该用例有更多的最佳解决方案: 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/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.