EdgeNGramFilterFactory在solr中运行不正常

时间:2014-12-17 06:17:31

标签: solr indexing n-gram search-suggestion

我正在 solr 中尝试 solr.EdgeNGramFilterFactory 已解释 here 我已在 schema.xml fieldType 中的索引analayzer 中添加了<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" />。 据我所知, solr.EdgeNGramFilterFactory 会创建令牌,例如

whether - wh, whe, whet, wheth, whethe, whether.

因此,当我搜索查询是否时,它会提供包含令牌的所有文档

"suggestion":["wether","ether","heather","walther" "weather","wheeler", "fletcher", "shepherd","together","whenever","wherever","another","blather","bother","brother","chothe","eiher","either","farther","father""feather","further","gather","goethe","günther" "higher","hucher","leather","mother","neither","nyheter", "other","rather","whence",      "where""shepherds","weathered","altogether","breathed","brothers","feathers","hitherto","northern","preacher","southern","withered"]

我只需相关文件,例如是否字,我需要weather, wether, ether, heather 不必要文档,如brother, shepherd etc

schema.xml中

<fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100">
       <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15" />
        <filter class="solr.LowerCaseFilterFactory"/>        
    </analyzer>
</fieldType>

solrconfig.xml:

<searchComponent name="suggest" class="solr.SpellCheckComponent">
<lst name="spellchecker">
      <str name="name">default</str>
      <str name="field">term</str>
     <str name="dictionaryImpl">DocumentDictionaryFactory</str>
      <str name="lookupImpl">org.apache.solr.spelling.suggest.jaspell.JaspellLookupFactory</str>
      <str name="buildOnCommit">true</str>
      <str name="queryAnalyzerFieldType">textSpell</str>
      </lst> 
    </searchComponent>

   <requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
    <lst name="defaults">
      <str name="df">term</str>
      <str name="spellcheck">on</str>
      <str name="spellcheck.dictionary">default</str>
      <str name="spellcheck.onlyMorePopular">true</str>
      <str name="spellcheck.count">500</str>
    </lst>
    <arr name="components">
      <str>suggest</str>
    </arr>
  </requestHandler>

3 个答案:

答案 0 :(得分:2)

尝试将minGramSize设置为更大的值,例如。 4或5以减少无关匹配的数量。另外,请查看文档以获取更多详细信息https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.EdgeNGramFilterFactory

答案 1 :(得分:2)

正如我在schema.xml文件中看到的那样,您使用的是NGramFilterFactory而不是 Edge NGramFilterFactory。这意味着您不会像您描述的那样创建令牌:

  

是否 - wh,whe,whet,wheth,是否。

使用NGramFilterFactory,您使用的标记将如下所示:

  

是否 - wh,whe,whet,wheth,whethe,是,他,het,heth,hethe,hether,et,eth,ethe,ether,th,the,...,

根据您的使用情况,您还应考虑在索引和查询时使用不同的标记器和过滤器。在索引和查询时分析Solr对数据执行的操作的一种好方法是使用分析工具https://cwiki.apache.org/confluence/display/solr/Analysis+Screen

答案 2 :(得分:1)

  • 第一件事

solr.EdgeNGramFilterFactory 对于我们在建议块中获得的建议并不受欢迎。 建议默认情况下使用class="solr.SpellCheckComponent" solr.EdgeNGramFilterFactory 适用于来自查询<的响应/结果 / strong>我们要求。

  • 第二名:

    MaxResultForSuggest = value。其中value可以是10(整数)

如果查询结果/响应 更多,而不是设置 MaxResultForSuggest的值,那么它会给出CorrectlySpelled = true没有提供有关查询的建议,而如果查询的结果/响应低于 MaxResultForSuggest 的设置值,那么它会给出CorrectlySpelled = false对查询提供了建议

         <str name="spellcheck.maxResultsForSuggest">10</str>
  • 第三:

您可以使用 spellcheck.alternativeTermCount 限制设置为显示建议

        <str name="spellcheck.alternativeTermCount">20</str>
  • 第四:

OnlyMorePopular = true : - 在 / suggest 中使用更好,因为它总是就单词是否拼写正确或错误提供建议

OnlyMorePopular = true : - / spell 中的更糟,因为不会提供建议在正确字词上。在我的情况下,它是这样工作,我也需要关于拼写正确的单词的建议。因此,我删除了 OnlyMorePopular 属性,默认值 仅限缺省值 false 。< / p>

  <str name="spellcheck.onlyMorePopular">false</str>

正确拼写的单词以及错误的单词上构建良好建议

Schema.xml:

<fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100">
       <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

Solrconfig.xml

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
    <str name="queryAnalyzerFieldType">textSpell</str>
    <lst name="spellchecker">
      <str name="name">default</str>
      <str name="field">term</str>
      <str name="classname">solr.DirectSolrSpellChecker</str>
      <str name="distanceMeasure">internal</str>      
      <float name="accuracy">0.5</float>
      <int name="maxEdits">2</int>
      <int name="minPrefix">0</int>
      <int name="maxInspections">5</int>
      <int name="minQueryLength">2</int>
      <float name="maxQueryFrequency">0.01</float>
    </lst>
</searchComponent>

<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
    <lst name="defaults">
      <str name="df">term</str>
      <str name="spellcheck.dictionary">default</str>
      <str name="spellcheck">on</str>
      <str name="spellcheck.extendedResults">true</str>       
      <str name="spellcheck.count">10</str>
      <str name="spellcheck.maxResultsForSuggest">10</str>
      <str name="spellcheck.alternativeTermCount">30</str>
    </lst>
    <arr name="last-components">
      <str>spellcheck</str>
    </arr>
  </requestHandler>