默认情况下,"Word"和"word"不是相同的词。我该如何使Lucene不区分大小写?
最简单的方法是将所有可搜索内容以及查询都转换为小写。可以查看LowerCaseFilter
文档。您还可以使用Wildcard
查询进行不区分大小写的搜索,因为它绕过了Analyzer
。
如果需要,可以将内容存储在不同的字段中以捕获不同的大小写配置。
StandardAnalyzer
应用LowerCaseFilter
,将"Word"和"word"视为相同。您可以直接将其传递给使用IndexWriter
和QueryParser
的过程中。例如:
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
IndexWriter writer = new IndexWriter(dir, analyzer, true, mlf);
QueryParser parser = new QueryParser(Version.LUCENE_30, field, analyzer);
除了使用包括LowerCaseFilter
和过滤常见英语单词(如“the”)的StandardAnalyzer
外,您还应该确保使用TextField
构建文档,而不是用于精确搜索的StringField
。
<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>