如何在Solr中进行停用词过滤的排序

3

我正在尝试按照一个字段对Solr查询进行排序,忽略停用词,但似乎找不到方法。例如,我希望结果按以下方式排序:

  • Charlie
  • A Fox
  • Helicopter

这个可能吗?现在该字段类型的定义如下:

    <fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" omitNorms="true">
      <analyzer>
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.TrimFilterFactory" />
        <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
        <filter class="solr.PatternReplaceFilterFactory" pattern="([^a-z])" replacement="" replace="all" />
      </analyzer>
    </fieldType>

然后像这样添加字段:

    <field name="title" type="alphaOnlySort" indexed="true" stored="false"/>

似乎其他人也需要做这个?或者说不使用停用词进行排序是不可取的?

请修复XML格式。 - Mauricio Scheffer
3个回答

2
KeywordTokenizerFactory不会将内容拆分成单独的片段,因此StopFilterFactory试图将标记(整个内容)与停用词列表匹配,并找不到匹配项。要从索引中获取停用词,您需要使用像WhitespaceTokenizerFactory这样的标记生成器,但是您不能在标记化字段上进行排序。因此,我能想到的唯一方法是:
  1. 仍然使用KeywordTokenizerFactory
  2. 去掉StopFilterFactory
  3. 并使用PatternReplaceFilterFactory(当前用于剥离数字)使用正则表达式从内容中删除停用词。
通常,您希望进行排序(而不是搜索)的唯一停用词是"A"、"AN"和"THE"。我不太擅长正则表达式,但我确信对许多人来说这很简单。

1

你需要将停用词过滤器实际添加到解析器链中。将要索引的文本粘贴到Solr Admin中的分析器字段中,你会发现“A Fox”中的A并没有被删除!


我已经在那里加入了停用词过滤器,但它在SO问题中没有显示出来。我已经修复了它。我也没有意识到有一个字段分析器。我可以使用它进行更快的调试,但我仍然遇到了问题...我唯一能想到的是stopwords.txt文件需要放在其他地方? - Jamie
stopwords.txt 应该放在你的 /conf/ 目录下。 - Eric Pugh

1

使用Eric提到的分析工具,我已经确定停用词过滤器只获取匹配的确切单词,而不是句子片段。如果有一个标记为“THE”的词,它会将其删除。但是,如果有一个“THE FISH”的记号,它不会触及它。

那么,有没有办法让这个工作?我只想在一个字段上进行排序,忽略任何停用词。但结果是一堆句子(或书名)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接