【问题标题】:How to sort solr without stopwords如何在没有停用词的情况下对 solr 进行排序
【发布时间】:2023-03-20 22:14:01
【问题描述】:

我正在尝试通过忽略停用词的字段对 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"/>

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

【问题讨论】:

  • 请修正xml格式。

标签: solr stop-words


【解决方案1】:

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

【讨论】:

  • 我有停用词过滤器,但它没有出现在 SO 问题中。我已经修好了。我也没有意识到有一个现场分析仪。我可以使用它进行更快的调试,但我仍然遇到问题......我唯一能想到的是 stopwords.txt 文件需要在其他地方?
  • stopwords.txt 应该在您的 /conf/ 目录中
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-25
      • 2011-04-12
      • 2019-02-17
      • 2014-08-28
      • 2022-12-31
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      相关资源
      最近更新 更多