solr sunspot精确搜索单词

时间:2012-06-22 09:02:41

标签: ruby-on-rails ruby solr sunspot

我有~50 M推文存档。我想看看其他用户是否互相提及。但有一些问题:有一个名为facebook的帐户(www.twitter.com/facebook)。我想搜索那些提及此帐户的推文,而不是简单地说facebook。

所以我使用太阳黑子的语法是:

search = FeedEntry.search do        
  without(:person_id,person.id) # No self referencing
  fulltext "@#{person.username}" #Find those Feeds that mention this person
  paginate :page => 1, :per_page => 1000000 #Make sure we dont paginate 
end

Solr似乎完全忽略了@符号,即使搜索将用户名放在“”或“”中也无关紧要。

search = FeedEntry.search{fulltext "facebook -RT"}
=> <Sunspot::Search:{:start=>0, :defType=>"dismax", :fq=>["type:FeedEntry"], :rows=>30, :q=>"facebook -RT", :fl=>"* score", :qf=>"retweeters_text text_text"}>
>> search.total
=> 299525

我该怎么办?我必须通过这些结果并使用ruby“include?”@ facebook“来理清那些耗时的误报。

我怀疑它与我正在使用的tokenizer工厂有关: http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.KeywordTokenizerFactory

schema.xml中的我的配置是:

<fieldType name="text" class="solr.TextField" omitNorms="false">
      <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

我认为将StandardTokenizerFactory更改为WhitespaceTokenizerFactory对我的情况有帮助。顺便说一句。有没有办法看到这些工厂在我的语料库中生成哪些令牌?

我的最后一个问题是在更改标记生成器后是否需要重新编制索引?我的假设是肯定的。

干杯 托马斯

2 个答案:

答案 0 :(得分:0)

如果您可以解析哈希标签,重新推文,@ name等索引这些推文并在solr中使用单独的字段,那么您将拥有更强大的搜索功能(恕我直言)。

如您所述,更改为空白标记生成器应该会有所帮助,您需要重新编制索引。您还需要在搜索过程中使用相同的标记器,分析器。

答案 1 :(得分:0)

StandardTokenizerFactory抛出标点符号,但没有空格后跟的句号除外。特别是,它会抛出“@”,因此你的@name搜索注定失败(因为搜索完整的电子邮件地址。虽然ClassicTokenizerFactory保留了电子邮件地址,但我相信它仍会从@name中删除“@” 。

WhitespaceTokenizerFactory会保留@name,但如果后跟逗号(@name@name,不同),它会以不同方式对待它,因此它可能仍然不是对你来说是正确的。您最终可能希望使用PatternTokenizerFactory指定您希望通过正则表达式解析的方式。