3

我正在尝试通过忽略停用词的字段对 solr 查询进行排序,但似乎找不到这样做的方法。例如,我希望结果排序如下:

  • 查理
  • 一只狐狸
  • 直升机

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

    <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"/>

似乎其他人也必须这样做?还是没有停用词的排序是禁忌?

4

3 回答 3

2

KeywordTokenizerFactory 不会将内容分成单独的部分,因此 StopFilterFactory 会尝试将令牌(整个内容)与停用词列表匹配并且找不到匹配项。要从索引中取出停用词,您需要使用像 WhitespaceTokenizerFactory 这样的标记器,但是您不能对标记化的字段进行排序。所以我能想到的唯一方法是:

  1. 仍然使用 KeywordTokenizerFactory,
  2. 摆脱 StopFilterFactory
  3. 并使用 PatternReplaceFilterFactory 使用正则表达式从内容中删除停用词(当前用于去除数字)。

通常,您想要进行排序(而不是搜索)的唯一停用词是“A”、“AN”、“THE”。我不太擅长 reg 表达式,但我敢肯定这对许多人来说是微不足道的。

于 2011-03-03T11:49:58.187 回答
1

使用 Eric 提到的分析器,我确定停用词过滤器只抓取匹配的确切单词,而不是句子的片段。因此,如果有“THE”的标记,它将删除它。但是,如果有“THE FISH”的令牌,它就不会碰它。

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

于 2010-08-03T15:57:33.337 回答
1

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

于 2010-08-03T14:50:56.707 回答