Thinking Sphinx - 显示来自协会的正确记录

Posted

技术标签:

【中文标题】Thinking Sphinx - 显示来自协会的正确记录【英文标题】:Thinking Sphinx - Showing the right record from the association 【发布时间】:2011-05-29 22:31:52 【问题描述】:

我已成功让 Thinking Sphinx 在相关模型上使用 Geolocation。快乐的日子!

但我现在需要它在 Google 地图上显示正确的关联记录。

场景是一家拥有多个办公室的公司。办公室有 lng,lat 值。我正在搜索公司并将办公室与它相关联。

例如

  define_index do

 indexes :name, :sortable => true
 indexes offices(:city), :as => :city
 indexes offices(:postal_code), :as => :postal_code

 has "RADIANS(offices.lat)", :as => :lat,  :type => :float
 has "RADIANS(offices.lng)", :as => :lng,  :type => :float

 has created_at
 has updated_at

 set_property :latitude_attr  => 'lat'
 set_property :longitude_attr => 'lng'
 set_property :field_weights  =>  'name'        => 10,
                                  'service_name' => 9,
                                  'city'    => 8 

 end

在 y 位置/邮政编码中搜索 x 公司非常有效,显示在 @geodist 半径内的所需位置设有办事处的正确公司。

例如

:geo=>[0.9283660690549609, -0.050527407508941975], :sort_mode=>:expr, :sort_by=>"@weight * @weight / @geodist", :with=>"@geodist"=>0.0..120700.8, :conditions=>:service_name=>"Business strategies", :page=>1, :per_page=>12, :star=>true

生成的记录是公司对象,而不是办公室,这对于列表视图很好,但我想在相关关联办公室的谷歌地图上显示图标。

在半径范围内找到相关的相关办公记录以显示的最佳方式是什么?

【问题讨论】:

【参考方案1】:

Sphinx 只能可靠地处理单值浮点属性 - 它没有成对的 lat/lng 值的概念。这意味着您无法对具有多个 lat/lng 对的对象进行可靠搜索。

最好的解决方法是在 Office 上实际搜索 - 并可能提取每个办公室的公司信息:

define_index do
  indexes company.name, :as => :name, :sortable => true
  indexes city, postal_code

  has "RADIANS(offices.lat)", :as => :lat,  :type => :float
  has "RADIANS(offices.lng)", :as => :lng,  :type => :float
  has company.created_at, :as => :created_at
  has company.updated_at, :as => :updated_at
  has company_id

  set_property :field_weights  => 
    'name'         => 10,
    'service_name' => 9,
    'city'         => 8
  
end

然后在搜索时,您可以按 company_id 分组,以确保任何公司只有一个结果(如果您愿意的话):

Office.search 'foo',
  :geo            => [lat, lng],
  :with           => '@geodist' => 0.0..120700.8
  :group_function => :attr
  :group_by       => 'company_id'

如果对于给定的 company_id 返回哪个 Office 很重要,那么您可能还需要使用 :group_clause 选项。文档cover this。

【讨论】:

谢谢帕特,我也需要加入公司的服务,但我会尝试使用 :through.... 来撤销加入。

以上是关于Thinking Sphinx - 显示来自协会的正确记录的主要内容,如果未能解决你的问题,请参考以下文章

java 并发原子性与易变性 来自thinking in java4 21.3.3

Sphinx、reStructuredText 显示/隐藏代码片段

在记录交互式会话时如何更改 Sphinx 显示的提示?

我无法在我的 Sphinx 文档中使用 Python 突出显示颜料

python文档生成工具:pydocsphinx;django如何使用sphinx?

Python-Sphinx中Toctree的多个级别