【问题标题】:SolR : How to make a spellchecker not case sensitive but which returns the original word with upper case letters?SolR:如何使拼写检查器不区分大小写,但返回带有大写字母的原始单词?
【发布时间】:2011-10-24 18:31:46
【问题描述】:

我正在开发一个 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>

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

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

【问题讨论】:

    标签: solr spell-checking case-insensitive


    【解决方案1】:

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

    不要在您的SuggestText 字段上使用LowerCaseFilterFactory,而是在第二个字段上使用LowerCaseFilterFactory(我们称之为)suggestText_lower。 比将“字段”复制到SuggestText字段中。

    所以“BriTnE”将通过键入“britne”而不是小写“suggestText”字段来匹配。

    【讨论】:

    • 我已经试过了,但结果和这里一样。
    【解决方案2】:

    您在这里混淆了关于索引和存储的一些事情。

    关于存储,当您设置 stored=true 时,该值将“按原样”存储,并且不反映索引 exple:&lt;field name="FIELDNAME" type="text" indexed="false" **stored="true"** multiValued="false" required="true" /&gt; 中的内容 要检查已存储的内容,只需执行一个简单的 : 查询即可显示所有字段。

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

    最后,您的查询也很重要,并且可能是您问题的解决方案。当您搜索 Britne 时,您应该构建一个具有相似性功能的搜索(模糊搜索),或者表明您希望从默认搜索中获得它。 您可以通过搜索 Britne~(与 Britne~0.5 相同)或 Britne~ 或 Britne~0.8 或其他方式进行尝试。您必须根据自己的需要和上下文对其进行微调。

    【讨论】:

      猜你喜欢
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 2014-11-28
      • 1970-01-01
      相关资源
      最近更新 更多