2011-05-09 110 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