Solr 5.1拼写检查器有时会在建议

时间:2015-09-24 15:03:34

标签: solr

背景

我在schema.xml中配置了类似以下内容的Solr拼写检查程序:

<fieldType name="spell_field" class="solr.TextField">
            <analyzer type="index">
                <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords.txt" />
        <filter class="solr.LengthFilterFactory" min="3" max="255" />
        <filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true" />
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
            </analyzer>
            <analyzer type="query">
                <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords.txt" />
        <filter class="solr.LengthFilterFactory" min="3" max="255" />
        <filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true" />
            <tokenizer class="solr.WhitespaceTokenizerFactory" />    
    </analyzer>
        </fieldType>

用于:

<field name="spellcheck" type="spell_field" indexed="true" stored="false" multiValued="true" />

,与solrconfig.xml中的以下内容类似:

<requestHandler name="/select" class="solr.SearchHandler">
    <lst name="defaults">
      <str name="echoParams">explicit</str>
      <int name="rows">10</int>
      <str name="df">dflt</str>
      <str name="spellcheck">true</str>
      <str name="spellcheck.dictionary">suggest</str>
      <str name="spellcheck.count">10</str>
      <str name="spellcheck.collate">true</str>
      <str name="spellcheck.maxCollations">3</str>
      <str name="spellcheck.collateMaxCollectDocs">1</str>
      <str name="spellcheck.maxCollationTries">2</str>
    </lst>
    <arr name="last-components">
        <str>suggest</str>
    </arr>
  </requestHandler>

  <searchComponent class="solr.SpellCheckComponent" name="suggest">
    <str name="queryAnalyzerFieldType">spellcheck</str>
    <lst name="spellchecker">
      <str name="name">suggest</str>    
      <str name="field">spellcheck</str>
      <str name="classname">solr.DirectSolrSpellChecker</str>
      <int name="minPrefix">1</int>
      <int name="minQueryLength">3</int>
      <int name="maxEdits">2</int>
      <int name="maxInspections">3</int>
      <int name="minQueryLength">3</int>
      <float name="maxQueryFrequency">0.01</float>
      <float name="thresholdTokenFrequency">.00001</float>
      <float name="accuracy">0.5</float>
    </lst>
  </searchComponent>

问题

Solr有时会返回包含特殊字符的搜索结果作为第一个建议。这是一个问题,因为我的应用程序使用第一个来重建查询。

例如,如果我搜索&#34; VOLTAGER&#34;,Solr产生的第一个拼写建议是&#34;电压:&#34;,因此重建的查询看起来像myField:voltage:。然后,在发送查询后,Solr的记录器显示以下警告:SpellCheckCollator: Exception trying to re-query to check if a spell check possibility would return any hits.

底层的Exception是一个解析错误,因为myField:voltage:不是有效的查询。

&#34; VOLTAGER&#34;还会返回一个简单的&#34;电压&#34;,但在建议列表的下方,我的要求声明我必须从列表中获取第一个拼写更正。

理想情况下,在上面的例子中,&#34; VOLTAGER&#34;只会返回&#34;电压&#34;。

我尝试过的事情

我尝试将以下行添加到spell_field字段类型的索引和查询分析器中:

<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([^a-zA-Z0-9])" replacement=""/>

这个 删除了拼写检查程序中的所有特殊字符,但它具有令人讨厌的副作用,同时也大大减少了拼写检查器返回的结果数量。例如,&#34; VOLTAGER&#34;不再回报任何东西。也没有&#34; circut&#34;,它通常会返回&#34;电路&#34;。

目前,我在Java应用程序中有以下连接到Solr的行:

correctedTerms = correctedTerms.replaceAll("[^A-Za-z0-9]", "");

它的工作原理是确保返回的内容没有特殊字符,但我宁愿配置Solr的拼写检查器来阻止首先使用特殊字符返回更正。

总结

我试图让Solr的拼写检查器停止在其建议中返回特殊字符。基本上我只想要回信。我如何实现我的目标?

1 个答案:

答案 0 :(得分:1)

在我最初的问题中,我显然对谁造成了什么错误以及在哪里造成了一些困惑。最终的问题是Solr使用附加了非法ASCII字符的术语(通常是:字符)自动测试校对。特殊字符并非来自整理,但是,它们只是由拼写检查器返回,即使我从分析的字段中删除了所有特殊字符,拼写检查器也会继续返回:字符的一些建议追加。

我解决这个问题的方法就是删除整理器本身。所以现在我的拼写检查配置如下所示:

<requestHandler name="/select" class="solr.SearchHandler">
    <lst name="defaults">
      <str name="echoParams">explicit</str>
      <int name="rows">10</int>
      <str name="df">dflt</str>
      <str name="spellcheck">true</str>
      <str name="spellcheck.dictionary">suggest</str>
      <str name="spellcheck.count">10</str>
    </lst>
    <arr name="last-components">
        <str>suggest</str>
    </arr>
  </requestHandler>

在从Suggestion Map中检索建议时,我的代码中仍然有以下内容:

correctedTerms = correctedTerms.replaceAll("[^A-Za-z0-9]", "");

令人讨厌,但至少现在Solr并没有在每次整理器失败时抛出一堆例外,而且我的代码可以提供一个安全网,以确保没有任何非法的东西归结为Solr。

缺点是我现在必须自己进行整理,与Solr不同,我无法保证任何一种整理都会产生结果。也就是说,我对拼写检查程序的要求不是很重要,所以虽然这种行为是不可取的,但这并不是不可接受的。

如果有人遇到这个问题并在不删除整理器的情况下解决了这个问题,我会非常有兴趣了解它。