Ruby on rails 太阳黑子精确搜索单词

Ruby on rails 太阳黑子精确搜索单词,ruby-on-rails,ruby,solr,sunspot,Ruby On Rails,Ruby,Solr,Sunspot,我有大约5000万条推特的档案。我想看看其他用户是否相互提及。但也存在一些问题:有一个名为facebook的账户(www.twitter.com/facebook)。我想搜索那些提到这个账户的推文,而不是简单地说facebook 因此,我使用sunspot的语法是: search = FeedEntry.search do without(:person_id,person.id) # No self referencing fulltext "@#{person.use

我有大约5000万条推特的档案。我想看看其他用户是否相互提及。但也存在一些问题:有一个名为facebook的账户(www.twitter.com/facebook)。我想搜索那些提到这个账户的推文,而不是简单地说facebook

因此,我使用sunspot的语法是:

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
search=FeedEntry.search{fulltext“facebook-RT”}
=>0,:defType=>“demax”,:fq=>[“type:FeedEntry”],:rows=>30,:q=>“facebook-RT”,:fl=>“*score”,:qf=>“retweeters\u text\u text”}>
>>搜索总数
=> 299525
我能做什么?我必须仔细检查这些结果,并使用ruby“include?”@facebook“来整理误报,这很耗时

我怀疑这与我正在使用的标记器工厂有关:

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会对我的情况有所帮助。顺便问一下,有没有办法查看这些工厂在我的语料库上生成了哪些令牌

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

干杯
托马斯

如果你能在索引这些推文时解析散列标签、重新推文、@name等,并在solr中使用单独的字段,那么你将拥有更强大的搜索功能(IMHO)


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

StandardTokenizerFactory会抛出标点符号,但不后跟空白的句点除外。尤其是,它会抛出“@“,因此您的@name搜索注定失败(搜索完整的电子邮件地址也是如此)。虽然
ClassicTokenizerFactory
保留电子邮件地址,但我相信它仍然会抛出@name中的“@”


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

您是对的,我可能会为它们创建适当的db字段,并将它们存储为tweet的附加数据。看起来Twitter也在这样做,因为他们还可以报告推文中提到的“实体”。非常感谢!