如何使Lucene不区分大小写

12

默认情况下,"Word"和"word"不是相同的词。我该如何使Lucene不区分大小写?

4个回答

12

最简单的方法是将所有可搜索内容以及查询都转换为小写。可以查看LowerCaseFilter文档。您还可以使用Wildcard查询进行不区分大小写的搜索,因为它绕过了Analyzer

如果需要,可以将内容存储在不同的字段中以捕获不同的大小写配置。


5
一两行示例代码可以让你的答案更完整。 - Aqeel Ashiq

7

StandardAnalyzer应用LowerCaseFilter,将"Word"和"word"视为相同。您可以直接将其传递给使用IndexWriterQueryParser的过程中。例如:

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
IndexWriter writer = new IndexWriter(dir, analyzer, true, mlf);
QueryParser parser = new QueryParser(Version.LUCENE_30, field, analyzer);

3

除了使用包括LowerCaseFilter和过滤常见英语单词(如“the”)的StandardAnalyzer外,您还应该确保使用TextField构建文档,而不是用于精确搜索的StringField


0
在Schema.xml文件中为该字段添加LowerCaseFilterFactory到你的fieldType中。例如:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
            <analyzer type="index">
                <tokenizer class="solr.WhitespaceTokenizerFactory"/>
                <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />
                <filter class="solr.LowerCaseFilterFactory"/>
            </analyzer>

            <analyzer type="query">
                <tokenizer class="solr.WhitespaceTokenizerFactory"/>
                <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
                <filter class="solr.LowerCaseFilterFactory"/>
            </analyzer>
        </fieldType>

很好的答案,但问题是关于Lucene的,它没有像Solr一样的模式。 - Tom Saleeba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接