我正在一个SolR项目中创建一个拼写检查器。
为什么我输入"britne"它会自动补全"Britne"吗,但是当我输入"Britne"它没有找到任何结果?以下是我的拼写检查字段:
<fieldType name="suggestText" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" ignoreCase="true"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory" ignoreCase="true"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" ignoreCase="true"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory" ignoreCase="true"/>
</analyzer>
</fieldType>
它在查询部分和索引部分都有LowerCaseFilterFactory,所以我猜它会将我的查询转换为小写,并与小写存储的单词进行比较,但显然不是。
此外,我希望当我键入"Britne", "Britne"或";BriTnE"结果"布兰妮";(而不是"布兰妮")。如何使我的拼写检查器不区分大小写,而是返回"区分大小写的单词"?
我不确定它是否有效,但也许你可以使用复制字段:
不要在你的建议文本字段上使用LowerCaseFilterFactory,而是在第二个字段(让我们调用这个)上使用LowerCaseFilterFactory。然后将"field"复制到建议文本字段中。
那么"BriTnE"将通过键入"BriTnE"而不将" suggestion text "字段小写来匹配
你在这里混淆了索引和存储的一些事情。
关于存储,当您设置stored=true时,该值将"按原样"存储,并且不反映索引示例中的内容:<field name="FIELDNAME" type="text" indexed="false" **stored="true"** multiValued="false" required="true" />
要检查已存储的内容,只需执行一个简单的:查询,显示所有字段。
接下来是索引。这里你正在处理(解析&过滤您的值,使其可搜索。对于相同的值,您可能必须创建多个索引才能进行不同类型的搜索。认真考虑一下,这通常是最好的选择。对于索引,使用"Schema Browser"检查索引值(打开管理控制台,选择实例,选择模式浏览器,然后选择要检查的字段并打开"Load term info")。"copyField"已经完成了,你只需要存储一次值。在那里,您将看到它是如何被解析的,并且它确实是小写的,正如您所想的那样:我在这里已经有了一些惊喜。如果你没有索引,你可以尝试这个tonkenizer <tokenizer class="solr.StandardTokenizerFactory"/>
与LowerCaseFilterFactory相结合,这对我来说很有效。
最后,您的查询也很重要,可能是您的问题的解决方案。当您搜索Britne时,您应该构建一个具有相似特性(模糊搜索)的搜索,或者表明您希望从默认搜索中获得它。你可以通过搜索Britne~(和Britne~0.5一样)或Britne~或Britne~0.8或其他什么来尝试。您必须根据您的需要和上下文对它进行微调。