2010-08-03 68 views
3

我想排序solr查询字段忽略停用词,但似乎无法找到一种方法来做到这一点。例如,我希望结果等来分类:如何排序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"/> 

好像别人能有我们这样做呢?或者是排序没有停用词一个禁忌?

+0

请修复xml格式。 – 2010-08-03 01:24:22

回答

1

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

+0

我在那里有停用词过滤器,但它没有出现在SO问题中。我修复了它。我也没有意识到有一个现场分析仪。我可以使用它来快速调试,但我仍然遇到问题......我能想到的唯一的事情是stopwords.txt文件需要在其他地方? – Jamie 2010-08-03 15:49:18

+0

stopwords.txt应该位于/ conf/dir中 – 2010-08-04 01:48:49

1

使用Eric提到的分析器,我确定停用词过滤器只捕获匹配的确切单词,而不是句子的片断。所以,如果有一个“THE”的标记,它会将其删除。但是,如果有一个“鱼”的标志,它不会触及它。

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

1

KeywordTokenizerFactory不会将内容分解为单独的片段,所以StopFilterFactory试图将令牌(整个内容)与停用词列表进行匹配并且找不到匹配。要从索引中获得停用词,您需要使用像WhitespaceTokenizerFactory这样的标记器,但是您无法在标记字段上排序。所以,我能想到的唯一办法做到这一点是:

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

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