2011-05-09 12 views
2

私はsunspotを使用しています。 LIKEクエリ(LIKE %q%)を実行するにはどうすればよいですか?Sunspot `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 

それは基本的に以下の黒点の検索ハッシュ生成:LIKE %query%を実装のない簡単な方法はありません場合は

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とのSOLRロジックを生成しますか?

+0

「部分的に私のために働く」とはどういう意味ですか? :)実際問題は、検索がうまくいかない、またはメソッドエイリアスがほしいということですか? –

+0

また、「より単純な方法」とはどういう意味ですか? .starting_with( 'sta')より簡単なことは何ですか? –

+0

あなたの答えをお寄せいただき、ありがとうございました。以下の要点で、私が部分的に私のために働く理由を説明します。おかげでhttps://gist.github.com/8257e7c4e512aa8a45df! – jpemberthy

答えて

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 docsまたはsimilar question on SOを参照してください。

+0

それで、あなたは問題を解決することができましたか?この回答は役に立ちましたか? –

+0

ちょっとVlad、ちょうどあなたがすでに答えたことを、感謝した。それをチェック:)。 – jpemberthy

+0

ええ、 'EdgeNGramFilter'はそのトリックを行います。ありがとう! – jpemberthy