2011-05-09 113 views
2

我正在使用sunspot。我如何运行LIKE查询(LIKE %q%)?我愿做这样的事情:而不是太阳黑子`LIKE`查询

@search = Sunspot.search(User) do |q| 
    q.text_fields { with(:company_name).like(params[:q]) } 
end.results 

@search = Sunspot.search(User) do |q| 
    q.text_fields { with(:company_name).starting_with(params[:q]) } 
end.results 

这部分对我的作品。回顾sunspot代码,我发现这段代码:

class StartingWith < Base 
    private 

    def to_solr_conditional 
    "#{solr_value(@value)}*" 
    end 
end 

它主要产生以下太阳黑子搜索哈希:

Sunspot.search(User) do |q| 
    q.text_fields { with(:company_name).starting_with("sta")} } 
end 

=> Sunspot::Search:{:q=>"*:*", :fq=>["type:User", "company_name_text:sta*"]} 

万一有实施LIKE %query%没有更简单的方法,我应该如何创建新类Like与方法to_solr_conditional它生成SOLR逻辑?

+0

你的意思是“部分为我工作”? :)事实上,问题是搜索不起作用,或者你只是想要一个方法别名? – 2011-05-18 17:07:27

+0

另外,你的意思是“不简单的方式”?什么比.starting_with('sta')更简单? – 2011-05-18 17:14:09

+0

嘿弗拉德,感谢您的回答,我将在下面的要点中解释为什么它对我有部分作用。 https://gist.github.com/8257e7c4e512aa8a45df谢谢! – jpemberthy 2011-05-18 18:43:57

回答

3

如果您使用标准的DisMax处理程序,它不支持通配符。你有2个选项:

a。激活EdgeNGramFilter:

<fieldType name="text" class="solr.TextField" omitNorms="false"> 
    <analyzer type="index"> 
    .. 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/> 
    .. 
    </analyzer> 
</fieldType> 

b。每晚使用建立Solr与EDismax Handler

请参阅wiki article on sunspot docssimilar question on SO

+0

那么,你是否设法解决这个问题?此回复有帮助吗? – 2011-05-20 12:07:50

+0

嘿弗拉德,刚刚意识到你已经回答了,谢谢。检查它:)。 – jpemberthy 2011-05-20 15:07:50

+0

是的,'EdgeNGramFilter'确实有效。谢谢! – jpemberthy 2011-05-20 15:32:07