当前位置: 首页 > 知识库问答 >
问题:

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

凤伟泽
2023-03-14

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

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

因此,我创建了区分大小写的分析器,下面是我的简单代码:

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个答案

黄英韶
2023-03-14

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

这是一个可能的解决方案,但是对于这个用例有更多的最佳解决方案: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/

 类似资料:
  • 问题内容: 我有一个Lucene索引,该索引当前区分大小写。我想添加的 选项 有不区分大小写作为后备的。这意味着与案例匹配的结果将获得更大的权重,并且将首先出现。例如,如果结果数限制为10,并且有10个匹配项符合我的情况,那就足够了。如果仅找到7个结果,则可以从不区分大小写的搜索中再添加3个结果。 我的案子实际上更复杂,因为我有不同重量的物品。理想情况下,匹配“错误”的表壳会增加一些重量。不用说,

  • 问题内容: 默认情况下,单词“ Word”和“ word”不相同。如何使Lucene不区分大小写? 问题答案: 最简单的方法是降低所有可搜索的内容以及查询的大小写。请参阅 文档。您也可以将查询用于不区分大小写的搜索,因为它绕过了。 如果需要,您可以将内容存储在不同的字段中以捕获不同的案例配置。

  • 对于报告(0.1%的所有查询),我需要返回一个所有可能类别的列表,区分大小写! 考虑以下文件: 运行以下查询: 返回: 是否有方法返回区分大小写的类别(存储在文档中)?我对此查询结果中的感兴趣。 Elasticsearch论坛中的问题 谢谢,伊泰

  • 问题内容: 我正在尝试提出一个要求区分大小写的结果的请求。 例如在我的数据库中 该请求是 但我有3行作为结果,我只想要abcdef 我试图找到一个解决方案 但是我有这个错误: 未知归类:’Latin1_General_CS_AS’{“成功”:false,“错误”:“#1273-未知归类:’Latin1_General_CS_AS’”} 谢谢 问题答案: 感谢您的帮助,我找到了不是latin1 ut

  • 问题内容: 在PHP中,变量名和常量名区分大小写,而函数名不区分大小写。 据我所知,PHP是发生这种情况的唯一语言。我使用的所有其他语言要么完全区分大小写,要么完全不区分大小写。 为什么PHP 部分 区分大小写? 请注意,我并不是在问 哪个 名称区分大小写,而是 为什么 。 更新资料 为了使那些认为我要问 哪个的 人受益,我想添加以下列表: 区分大小写 弦乐 变数 对象属性 常量,默认情况下 不区