带破折号的 Solr 查询

Solr Queries With Dashes

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

因此,如果我搜索这些词,"wi-fi adapter"。我有一个文件,标题为 "wifi adapter"。我不会得到任何结果。

我目前正在使用 solr.MappingCharFilterFactory 将破折号映射到 space。这就是我的 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 包含行..

"-" => " "

这条规则的作用是将破折号转换为 space。

因此,如果我搜索 "wi fi adapter",它将始终显示与 "wi fi adapter" 相同的结果,但不会显示 "wifi adapter".

的结果

有什么办法可以像这样处理破折号吗?基本上我想对待 "wifi adapter", "wi-fi adapter", and "wi fi adapter" 一样。

您可以将 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