-1

考えるスフィンクスで複雑な検索をしたい:

-> 都市に住んでいる (city_id 属性) -> または都市に移動できる (mobile_cities 関連付け) -> または緯度/経度点から最大距離に住んでいるユーザーを検索します。各ユーザーで、mobility_distance 属性に設定されます。

今のところ、私は3つの異なる検索でそれを行いました.私は自発的に大きなper_page番号を設定し、次に3つの結果を単一の配列にマージし、この配列をページ付けします:

#users living in the @city
search_set_living = search_set.merge({:city_id => @city.id })
users_living =  User.search :with => search_set_living.dup,
                                :page => 1, :per_page => 1000

#users declaring hability to move to the @city
search_set_mobile = search_set.merge({:mobile_cities_ids => @city.id })
users_mobile =  User.search :with => search_set_mobile.dup, :page => 1, :per_page => 1000

#users living at a maximum distance from the origin point(custom distance for each user, max 30km)   
search_set_around = search_set.merge({"@geodist" => 0.0..30_000.0})
users_around =  User.search :geo => [@search_latitude * Math::PI / 180 , @search_longitude * Math::PI / 180],
                                  :with => search_set_around.dup,
                                  :page => 1, :per_page => 1000
users_around_filtered = users_around.dup.delete_if{|user| (user.mobility_distance * 1000 )< user.sphinx_attributes['@geodist'] }


#merge the 3 results in a array
all_users =  (users_mobile.flatten + users_around_filtered.flatten).uniq

#look for facets and paginate the array
@facets = User.facets :with => {:user_id => all_users.map(&:id)}
@users_to_display =  all_users.paginate(:page => params[:page], :per_page => 10)

これは正常に動作していますが、満足していません: -パフォーマンスがあまり良くありません。

まったく同じ検索を行いたいのですが、単一のスフィンクスの検索で行います。ドキュメントの「OR Logic with Attribute Filters」を使用する必要があることはわかっていますが、それを geo_search 呼び出しと組み合わせる方法がわかりません...その方法が本当にわかりません。助けてもらえますか?

どうもありがとう、

4

2 に答える 2

-1

すごい !どうもありがとう。機能させるために、構文を少し修正する必要がありました(括弧がいくつかありません)。per_page および page 引数も追加する必要がありましたが、その理由はよくわかりません。

logic = ["city_id = #{@city.id}",
         "IN(mobile_cities_ids, #{@city.id})",
         "GEODIST(latitude, longitude, #{@search_latitude * Math::PI / 180}, #{@search_longitude * Math::PI / 180}) < (mobility_distance * 1000)"]

search_set_logic = search_set.merge({:valid => true})
@users_to_display = User.search :sphinx_select => "*, (#{logic.join(" OR ")}) AS valid",
                 :with => search_set_logic.dup,
                 :sort_mode => :extended,
                 :order => "visibility DESC, last_login_at DESC",
                 :page => params[:page], :per_page => 10
于 2012-08-05T15:14:58.680 に答える