Lucene如何在区分大小写和不区分大小写之间切换

时间:2017-01-30 20:36:38

标签: java search lucene full-text-search

我想让用户选择区分大小写或不区分大小写的搜索。

我的想法是使用区分大小写的分析器来索引数据,然后根据用户输入使用敏感或不敏感的分析器进行搜索。

所以我创建了我的区分大小写的分析器,这里的代码很简单:

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;

当我厌倦了这一点时,敏感的案例有效,但不敏感的案例却没有。

经过更多的研究,我发现使用具有较低关怀查询的区分大小写的分析器是行不通的。区分大小写的分析器使用区分大小写的查询和不区分大小写的分析器索引工作,使用不区分大小写的查询,任何人都可以确认这一点吗?

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

1 个答案:

答案 0 :(得分: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/