3

我有一个大约 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 对我来说会有所帮助。顺便提一句。有没有办法查看这些工厂在我的语料库上生产了哪些令牌?

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

干杯托马斯

4

2 回答 2

0

StandardTokenizerFactory抛出标点符号,除了不跟空格的句点。特别是,它会抛出“@”,因此您的 @name 搜索注定要失败(就像搜索完整的电子邮件地址一样。虽然ClassicTokenizerFactory保留了电子邮件地址,但我相信它仍然会从 @name 中抛出“@”。

WhitespaceTokenizerFactory保留@name,但如果它后跟逗号(与 不同),它会以不同的方式处理它,@name因此@name,它可能仍然不适合您。您可能最终想要使用PatternTokenizerFactory您确切指定要如何通过正则表达式进行解析的位置。

于 2014-04-18T16:31:56.743 回答
0

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

如您所述,更改为空白标记器应该会有所帮助,并且您需要重新索引。您还需要在搜索期间使用相同的标记器、分析器。

于 2012-06-22T11:33:56.057 回答