【问题标题】:Lucene how to switch between case sensitive and case insensitiveLucene如何在区分大小写和不区分大小写之间切换
【发布时间】: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


    【解决方案1】:

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

    这将是一个可能的解决方案,但对于该用例还有更优化的解决方案: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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 2012-12-01
      相关资源
      最近更新 更多