我有~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对我的情况有帮助。顺便说一句。有没有办法看到这些工厂在我的语料库中生成哪些令牌?
我的最后一个问题是在更改标记生成器后是否需要重新编制索引?我的假设是肯定的。
干杯 托马斯
答案 0 :(得分:0)
如果您可以解析哈希标签,重新推文,@ name等索引这些推文并在solr中使用单独的字段,那么您将拥有更强大的搜索功能(恕我直言)。
如您所述,更改为空白标记生成器应该会有所帮助,您需要重新编制索引。您还需要在搜索过程中使用相同的标记器,分析器。
答案 1 :(得分:0)
StandardTokenizerFactory
抛出标点符号,但没有空格后跟的句号除外。特别是,它会抛出“@”,因此你的@name搜索注定失败(因为搜索完整的电子邮件地址。虽然ClassicTokenizerFactory
保留了电子邮件地址,但我相信它仍会从@name中删除“@” 。
WhitespaceTokenizerFactory
会保留@name,但如果后跟逗号(@name
与@name,
不同),它会以不同方式对待它,因此它可能仍然不是对你来说是正确的。您最终可能希望使用PatternTokenizerFactory
指定您希望通过正则表达式解析的方式。