Ruby on rails 3 搜索与Rails和Thinking Sphinx有很多关系

Ruby on rails 3 搜索与Rails和Thinking Sphinx有很多关系,ruby-on-rails-3,thinking-sphinx,Ruby On Rails 3,Thinking Sphinx,我正在尝试用Sphinx 0.9.10和Thinking Sphinx为我的Rails 3应用程序构建搜索功能。我希望用户搜索歌曲。我的歌曲可以有很多曲目。例如,歌曲“Beautiful song”可以有一个音频曲目链接到mp3,一个视频曲目链接到youtube 目前,当我只有一首歌曲的相关曲目时,我的搜索功能运行良好,但当我有多首曲目时,搜索功能会出现问题 我的用户应该能够输入关键字,并进行筛选,以查找至少有一个音频曲目、至少有一个视频曲目或每个曲目中至少有一个的歌曲 到目前为止,我的歌曲有以

我正在尝试用Sphinx 0.9.10和Thinking Sphinx为我的Rails 3应用程序构建搜索功能。我希望用户搜索歌曲。我的歌曲可以有很多曲目。例如,歌曲“Beautiful song”可以有一个音频曲目链接到mp3,一个视频曲目链接到youtube

目前,当我只有一首歌曲的相关曲目时,我的搜索功能运行良好,但当我有多首曲目时,搜索功能会出现问题

我的用户应该能够输入关键字,并进行筛选,以查找至少有一个音频曲目、至少有一个视频曲目或每个曲目中至少有一个的歌曲

到目前为止,我的歌曲有以下模式:

class Song < ActiveRecord::Base
  ...
  has_many :tracks
  ...

  define_index('song') do
    indexes                               :name, 
                                          :sortable   => :true
    has     "tracks.media LIKE '%audio%'",:as         => :audio,
                                          :type       => :boolean
    has     "tracks.media LIKE '%video%'",:as         => :video,
                                          :type       => :boolean
  end
end
classsong:true
具有“类似“%audio%”的tracks.media,:as=>:audio,
:type=>:boolean
具有“类似“%video%”的tracks.media,:as=>:video,
:type=>:boolean
结束
结束
在我的轨迹模型中,我使用的是一个序列化媒体字段。Ruby将其视为一个散列,其中包含一个链接和一个类型(例如“audio/m4u”或“video/mp4”)。MySQL将其视为一个字符串

class Track < ActiveRecord::Base
  belongs_to :Song

  serialize :media
end
classtrack
在我的歌曲控制器中,我有如下内容:

class CoursesController < ApplicationController
  def search
      with_params[:audio] = true if search[:audio] == true || search[:audio] == 'true'  || search[:audio] == "1"
      with_params[:video] = true if search[:video] == true || search[:video] == 'true' || search[:video] == "1"

      @songs = Song.search(
      keywords,
      :with       => with_params
      ...
      )
      ...
  end
end
GROUP_CONCAT(`tracks`.`media` SEPARATOR ' ')
class CoursesControllerwith_参数
...
)
...
结束
结束
当我只有一首歌曲相关联的曲目时,搜索结果很好

但当我有多首曲目时,搜索索引似乎只会看到第一首曲目:如果“Beautiful song”有第一首曲目“video”和第二首曲目“audio”,则只有在我的过滤器中选择“video”时才会在搜索结果中显示,如果选择“audio”则不会显示


我缺少什么?

您需要做的是与媒体列的串联值进行比较。在MySQL中,这将如下所示:

class CoursesController < ApplicationController
  def search
      with_params[:audio] = true if search[:audio] == true || search[:audio] == 'true'  || search[:audio] == "1"
      with_params[:video] = true if search[:video] == true || search[:video] == 'true' || search[:video] == "1"

      @songs = Song.search(
      keywords,
      :with       => with_params
      ...
      )
      ...
  end
end
GROUP_CONCAT(`tracks`.`media` SEPARATOR ' ')
或者对于PostgreSQL(使用8.4或更高版本-如果您使用的是旧版本,请告诉我):


谢谢你,帕特!我如何做OR语句而不是And?(现在,如果我同时选中“audio”和“video”,它会返回包含音频和视频曲目的歌曲,但我喜欢包含音频和/或视频曲目的歌曲)我只想添加另一个属性,检查连接的结果是否与视频或音频相似。不过有一种纯粹的狮身人面像方法:完美!我创建了一个新属性。。。它更符合我当前的代码。