SolR:如何使一个拼写检查器不区分大小写,但是用大写字母返回原始单词?

时间:2011-08-11 08:24:27

标签: solr spell-checking case-insensitive

我正在开发一个SolR项目来创建一个咒语

为什么如果我输入“britne”它会自动填充“britney”,但是当我输入“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>

它在查询部分AND和索引部分中有LowerCaseFilterFactory,所以我猜测它会将我的查询转换为lowerCase并与以小写字母存储的单词进行比较,但显然不是。

此外,当我输入“Britne”,“britne”或“BriTnE”结果“Britney”(而不是“britney”)时,我想拥有。如何使我的拼写检查器不区分大小写,但返回“区分大小写的单词”?

2 个答案:

答案 0 :(得分:0)

我不确定它是否有效,但也许您可以使用复制字段:

不要在suggestText字段上使用LowerCaseFilterFactory,而是在第二个字段上使用LowerCaseFilterFactory(让我们调用它)suggestText_lower。 然后将“字段”复制到suggestText字段中。

因此,在不降低“suggestText”字段的情况下输入“britne”来匹配“BriTnE”。

答案 1 :(得分:0)

这里有关于索引和存储的一些问题。

关于存储,当您设置stored = true时,该值将按原样存储&#39;并没有反映索引中的内容:<field name="FIELDNAME" type="text" indexed="false" **stored="true"** multiValued="false" required="true" /> 要检查已存储的内容,只需创建一个显示所有字段的简单查询。

接下来,索引。在这里,您正在处理(解析和过滤)您的值以使其可搜索。对于相同的值,您可能必须使多个索引能够进行不同类型的搜索。认真考虑一下,这通常是最好的选择。 对于索引,请使用&#34; Schema Browser&#34;检查索引值(打开管理控制台,选择您的实例,然后选择架构浏览器,然后选择要检查的字段并打开&#34;加载术语信息&#34;)。 &#34; copyField&#34;为此完成,你只需要存储一次值。 在那里你可以看到它是如何被解析的,如果真的低了你的想法:我已经有了一些惊喜。如果你没有索引,你可以试试这个tonkenizer <tokenizer class="solr.StandardTokenizerFactory"/>和LowerCaseFilterFactory,这对我有用。

最后,您的查询也很重要,可能是您问题的解决方案。当您搜索Britne时,您应该使用相似性功能(模糊搜索)构建搜索,或者指示您希望它来自默认搜索。 您可以尝试搜索Britne~(同样是Britne~0.5)或Britne~或Britne~0.8等等。您必须根据自己的需要和背景对其进行微调。