【发布时间】:2018-09-29 08:11:58
【问题描述】:
默认情况下,单词“Word”和“word”不一样。如何让 Lucene 不区分大小写?
【问题讨论】:
默认情况下,单词“Word”和“word”不一样。如何让 Lucene 不区分大小写?
【问题讨论】:
最简单的方法是将所有可搜索的内容和查询都小写。请参阅LowerCaseFilter 文档。您还可以使用Wildcard 查询进行不区分大小写的搜索,因为它绕过了Analyzer。
如果愿意,您可以将内容存储在不同的字段中以捕获不同的案例配置。
【讨论】:
StandardAnalyzer 应用了LowerCaseFilter,这将使“Word”和“word”相同。您可以简单地将其传递给您对IndexWriter 和QueryParser 的使用。例如。几行sn-ps:
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
IndexWriter writer = new IndexWriter(dir, analyzer, true, mlf);
QueryParser parser = new QueryParser(Version.LUCENE_30, field, analyzer);
【讨论】:
除了使用StandardAnalyzer(包括LowerCaseFilter 和常用英文单词(例如“the”)过滤器)之外,您还应该确保使用TextFields 构建文档,而不是StringField用于精确搜索。
【讨论】:
将 LowerCaseFilterFactory 添加到 Schema.xml 中该字段的 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>
【讨论】: