带有破折号的Solr查询

时间:2018-11-27 18:49:10

标签: solr solrnet

我目前正在使用solr edismax在我们的网站上进行搜索。我想做的基本上是使破折号被忽略。

因此,如果我搜索“ wi-fi适配器”一词。我有一个标题为“ wifi adapter”的文档。我没有结果。

我当前正在使用solr.MappingCharFilterFactory将破折号映射到空格。这就是我的模式中text_general字段类型的样子。

  <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
    <analyzer type="index">
      <tokenizer class="solr.ClassicTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <charFilter class="solr.MappingCharFilterFactory" mapping="mapping.txt"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <charFilter class="solr.HTMLStripCharFilterFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.ClassicTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <charFilter class="solr.MappingCharFilterFactory" mapping="mapping.txt"/>
      <filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <charFilter class="solr.HTMLStripCharFilterFactory"/>
    </analyzer>
  </fieldType>

我的mapping.txt包含该行。

"-" => " "

因此,此规则的作用是将破折号转换为空格。

因此,如果我搜索“无线适配器”,它将始终显示与“无线适配器”相同的结果,但不会显示“无线适配器”的结果。

有没有办法像这样处理破折号?本质上,我想将“ wifi适配器”,“ wi-fi适配器”和“ wi fi适配器”相同。

-保罗

1 个答案:

答案 0 :(得分:3)

您可以将WordDelimiterGraphFilterFactory用于分析仪。它具有许多可以使用的属性。我列出了一些。

WordDelimiterGraphFilterFactory具有许多属性。

generateWordParts :(整数,默认为1)如果非零,则在定界符处分割单词。例如:"CamelCase", "hot-spot" → "Camel", "Case", "hot", "spot"

preserveOriginal :(整数,默认为0)如果非零,则保留原始令牌:"Zap-Master-9000" → "Zap-Master-9000", "Zap", "Master", "9000"

catenateWords :(整数,默认为0)如果非零,则将加入最大部分的单词部分:"hot-spot-sensor’s" → "hotspotsensor"

因此,您的情况就像

<fieldType name="text_wd" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
          <!-- Splits words based on whitespace characters --> 
          <tokenizer class="solr.WhitespaceTokenizerFactory"/>
          <!-- splits words at delimiters based on different arguments --> 
          <filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="1" catenateWords="1"/>
          <!-- Transforms text to lower case -->   
          <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>

        <analyzer type="query">
          <tokenizer class="solr.WhitespaceTokenizerFactory"/>
          <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
  </fieldType>

有关更多信息,请访问Fiters available in solr