Solr ngram与特殊字符的术语不匹配

时间:2015-01-27 12:28:37

标签: solr autosuggest n-gram

通过对此blog的引用,我向schema.xml添加了新的Solr字段类型“text_suggest_ngram”,如下所示。

<fieldType name="text_suggest_ngram" class="solr.TextField">
   <analyzer type="index">
      <charFilter class="solr.MappingCharFilterFactory" 
                  mapping="mapping-ISOLatin1Accent.txt" />
      <tokenizer class="solr.StandardTokenizerFactory" />
      <filter class="solr.WordDelimiterFilterFactory" 
              generateWordParts="1" generateNumberParts="1" 
              catenateWords="0" catenateNumbers="0" 
              catenateAll="0" splitOnCaseChange="1" />
      <filter class="solr.LowerCaseFilterFactory" />
      <filter class="solr.EdgeNGramFilterFactory" 
              maxGramSize="20" minGramSize="1" />
      <filter class="solr.PatternReplaceFilterFactory" 
              pattern="([^\w\d\*æøåÆØÅ ])" replacement="" replace="all" />
   </analyzer>
   <analyzer type="query">
      <charFilter class="solr.MappingCharFilterFactory" 
                  mapping="mapping-ISOLatin1Accent.txt" />
      <tokenizer class="solr.StandardTokenizerFactory" />
      <filter class="solr.WordDelimiterFilterFactory" 
              generateWordParts="0" generateNumberParts="0" 
              catenateWords="0" catenateNumbers="0" 
              catenateAll="0" splitOnCaseChange="0" />
      <filter class="solr.LowerCaseFilterFactory" />
      <filter class="solr.PatternReplaceFilterFactory" 
              pattern="([^\w\d\*æøåÆØÅ ])" replacement="" replace="all" />
      <filter class="solr.PatternReplaceFilterFactory" 
              pattern="^(.{20})(.*)?" replacement="$1" replace="all" />
   </analyzer>

以下是solrconfig.xml的suggestngram请求处理程序

<requestHandler name="/suggestngram" class="solr.SearchHandler">
       <lst name="defaults">
          <str name="echoParams">explicit</str>
          <str name="defType">edismax</str>
          <str name="rows">10</str>
          <str name="fl">myterm</str>
          <str name="qf">term_suggest^30 term_suggest_ngram^50.0</str>
          <str name="pf">term_suggest_edge^50.0</str>
          <str name="group.field">term_suggest_ngram</str>
          <str name="sort">count desc, term_suggest_ngram asc</str>
          <str name="group.sort">count desc</str>
       </lst>
</requestHandler>

这适用于所有情况,除非我查找具有特殊字符的条款,例如“汽车和自行车”或“car.bike”它忽略了特殊字符&amp;显示不相关的结果。如果我搜索摇滚乐,它会显示摇滚乐,摇滚乐,滚动等。 我也尝试过/在特殊角色之前。

1 个答案:

答案 0 :(得分:1)

<filter class="solr.PatternReplaceFilterFactory" pattern="([^\w\d\*æøåÆØÅ ])" replacement="" replace="all" />

这会删除大部分不常见的字符。所以,这可能是你的问题。尝试将其评论出来,看看你得到了什么。

但一般来说,您可以查看Web Admin UI的分析屏幕,看看文本如何通过每个单独的过滤器以及它成为您不期望的位置。您甚至可以在另一侧输入查询文本,看它是否会按预期匹配。这是强烈推荐的,特别是如果你只是复制了定义而没有完全理解它的作用。