2011-12-02 5 views
5

私は太陽黒点Sunspot:異なる値を持つ複数のフィールドでフルテキストクエリを実行する方法は?

q=exact_term_text:foo OR term_textv:foo* OR alternate_text:bar* 

と、次の生のSolrクエリーを再現したいのですが、私はあれば理解することはできませんよ、それはそれだので、どのようにこれは、標準の黒点インタフェースを介して、可能です:

  1. fulltext方法は、私はどちらか"foo"または"bar"再を渡すかのように、私はfulltextに最初のものとして渡す引数は何か分からないでしょう
  2. 複数のテキスト/ search_fields引数を受け入れていないようですスクロールが一致しない
  3. 空の引数を渡すと、私はq=*:*
  4. というスコープのフィルタを取得します。 with(:term).starting_with('foo*')は(名前が示すように)フィルタクエリとして適用されるため、スコアリングには関与しません。

文字列を手作業で作成することも可能ですが(おそらくadjust_solr_paramsを使用することもできますが)、それは怪しいようです。より良い解決策はありますか?

答えて

8

Sunspot 2.0.0には、機能しない、文書化されていない、サポートされていない動作があります。作者自身は、それはしてはならないと示唆しており、将来のバージョンではおそらくそうではないでしょう。あなたが複数のフルテキストを渡すことができ

は、検索定義を呼び出す

これはのSolrのクエリで結果
Post.search do 
    fulltext "foo", {:fields => :exact_term} 
    fulltext "bar", {:fields => :alternate} 
end 

https://github.com/sunspot/sunspot/wiki/Matching-substrings-in-fulltext-search

で覆われている部分文字列マッチング

INFO: [] webapp=/solr path=/select 
params={fl=*+score&start=0&q=_query_:"{!dismax+qf%3D'exact_term'}foo"+_query_:"{!dismax+qf%3D'alternate'}bar"&wt=ruby&fq=type:Post&rows=30} 
hits=1 status=0 QTime=7 

(ログから)

デフォルト演算子の変更(AND/OR)は、オプションを追加することで行うことができます minimum_match 1 http://blog.tonycode.com/archives/192

+0

(エッジ)ngramsを使用することは、同じフィールドを2回繰り返します。 susnpotのdismaxクエリハンドラを使用しても、ハッキリした解決法を使わないでluceneクエリを行うことはできないようです。だから私はとにかく答えを受け入れています。 – riffraff

+3

https://github.com/sunspot/sunspot/wiki/Fulltext-searchにあるSunspotのドキュメントでは、明示的に次のように述べています。「キーワードメソッドは1回の検索で複数回呼び出されるべきではないことに注意してください。以前に指定されたキーワード。 *( 'keywords'は' fulltext'にエイリアスされていますが、それらは同じ方法です)*著者によれば、あなたのソリューションは動作しません...しかし、それは完全に動作するようです。うーん、誰かが横たわっている。 – Jazz

+0

おそらく、フルテキストを同じフィールドで2回呼び出さないでください。 – juanpastas

2

documentationが正しい場合は、fulltextを2回呼び出すことはできません。だから私は2つの検索を実行し、両方の検索の交差点を計算してしまった。

a = Post.search do 
    fulltext "foo", {:fields => :exact_term} 
end 

b = Post.search do 
    fulltext "bar", {:fields => : alternate} 
end 

result = a & b 

どのように交差点を計算するかは、達成しようとしているものによって異なります。上記の交差点は少し素朴です。たとえば、各結果のスコアをmaxに対して正規化し、正規化されたスコアの平均をソートの目的に使用することができます。

1

異なるフィールドを複数のフルテキスト検索で異なる値で検索する必要もあります。さらに、私はすべての条件を満たしておく必要があります。言い換えれば私は、 'foo'と 'bar'の両方が、exact_termとalternateフィールドのPostにある必要があるということです。

Post.search do 
    fulltext "foo", {:fields => :exact_term} 
    fulltext "bar", {:fields => :alternate} 
end 

問題は、私がschema.xml設定(defaultOperator)を変更できなかったことです。それは 'OR'に設定されました。同様の問題がある場合は、次のような回避策をとることができます:

Post.search do 
    adjust_solr_params do |params| 
     params[:q] = params[:q].gsub(/\s_query/, " AND _query") if params[:q].present? 
    end 
end 
関連する問題