我有一个大约 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" 来整理耗时的误报。
我怀疑它与我正在使用的标记器工厂有关: 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 对我来说会有所帮助。顺便提一句。有没有办法查看这些工厂在我的语料库上生产了哪些令牌?
我的最后一个问题是更改标记器后是否需要重新索引?我的假设是肯定的。
干杯托马斯