Solr 5.1拼写检查器有时会在建议中返回特殊字符

TMBT

背景

我有一个Solr拼写检查器,其配置如下schema.xml

<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有时会返回带有特殊字符的搜索结果作为第一个建议。这是一个问题,因为我的应用程序使用第一个重建查询。

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

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

“ VOLTAGER”也返回一个普通的“ voltage”,但在建议列表的更下方,并且我的要求状态是必须从列表中进行第一次拼写更正。

理想情况下,在上面的示例中,“ VOLTAGER”将仅返回“电压”。

我尝试过的

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

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

确实从拼写检查器中删除了所有特殊字符,但是它的副作用还在于,它急剧减少了从拼写检查器返回的结果数量。例如,“ VOLTAGER”不再返回任何内容。通常返回“电路”的“ circut”也不起作用。

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

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

它可以通过确保返回的内容没有特殊字符来工作,但是我宁愿将Solr的拼写检查器配置为首先停止返回具有特殊字符的更正。

总之

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

TMBT

在我最初的问题中,我显然对谁造成什么错误以及在哪里造成错误感到困惑。最终的问题是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>

并且从“建议映射”中检索建议时,我的代码中仍然包含以下内容:

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

烦人的,但至少现在,每次整理器失败时,Solr都不会引发很多异常,并且我的代码可以提供一个安全网,以确保没有任何非法行为可以归结到Solr。

缺点是我现在必须自己进行归类,与Solr不同,我不能真正保证任何一个归类都会产生结果。就是说,我对拼写检查器的要求不是很重,因此尽管这种行为是不希望的,但也不是不可接受的。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

solr5中EdgeNGramFilterFactory的更改

来自分类Dev

Solr(5.3.1)拼写检查与建议

来自分类Dev

Solr(5.3.1)拼写检查与建议

来自分类Dev

本地参数不在solr 8中工作,但在solr 5中工作

来自分类Dev

如何在Solr 5中创建新核心?

来自分类Dev

在Solr5中更新后获取文档版本

来自分类Dev

Solr(Solarium)与laravel 5在database.php中的连接

来自分类Dev

Solr(Solarium)与laravel 5在database.php中的连接

来自分类Dev

Solr俄语拼写检查

来自分类Dev

Solr 5的配置(Umlaute,特殊字符和字符串长度)

来自分类Dev

启动Solr时增加30秒的Solr5超时

来自分类Dev

在一个环境中针对多核(针对不同的语言文档)Solr 5的Sunspot / rails配置

来自分类Dev

Solrj与Solr建议者

来自分类Dev

Solr查询建议

来自分类Dev

在Debian 8上安装Solr 5

来自分类Dev

在Debian 8上安装Solr 5

来自分类Dev

将MYSQL表索引到Solr 5

来自分类Dev

Solr 5无模式复制模式

来自分类Dev

Solr拼写检查建议永远不会返回德国变音符

来自分类Dev

Solr拼写检查建议总是将0作为匹配数返回

来自分类Dev

Solr:使XML作为Solr 4.8.1中的响应

来自分类Dev

Solr:使XML作为Solr 4.8.1中的响应

来自分类Dev

存储在Solr字段中的Solr查询

来自分类Dev

用特殊字符搜索solr

来自分类Dev

Solr用特殊字符排序

来自分类Dev

SOLR特殊字符和表情

来自分类Dev

如何在PHP PECL扩展中启用solr拼写检查程序或建议程序

来自分类Dev

在Solr中超时查询

来自分类Dev

Solr中的DoubleMetaphoneFilterFactory