Ruby on rails 在sphinx中将布尔字段索引为字符串

Ruby on rails 在sphinx中将布尔字段索引为字符串,ruby-on-rails,thinking-sphinx,Ruby On Rails,Thinking Sphinx,我用斯芬克斯思考搜索postgres数据库 我正在搜索的表中的一个字段是布尔值。 我希望在搜索查询中使用某个关键字时能够匹配该布尔值 举例说明: 我的网站是为那些开发自己的黑白电影的人而设。 我有一张配方表,人们在上面描述如何冲洗胶片。该表有一个布尔列,称为“stand_developed”(冲洗胶片的一种方法)。 我想返回当用户搜索单词“stand”时该字段为true的结果 我已经通过了测试,但没有真正发现是否可能 我想我可以通过解析查询词并添加一个条件来破解控制器方法中的某些东西,但有没有更

我用斯芬克斯思考搜索postgres数据库

我正在搜索的表中的一个字段是布尔值。 我希望在搜索查询中使用某个关键字时能够匹配该布尔值

举例说明:
我的网站是为那些开发自己的黑白电影的人而设。
我有一张配方表,人们在上面描述如何冲洗胶片。该表有一个布尔列,称为“stand_developed”(冲洗胶片的一种方法)。
我想返回当用户搜索单词“stand”时该字段为true的结果

我已经通过了测试,但没有真正发现是否可能


我想我可以通过解析查询词并添加一个条件来破解控制器方法中的某些东西,但有没有更干净的方法呢?

这就是我使用ThinkingSphinx搜索布尔字段时所做的。通过以下方式将
stand\u developed
与查询字符串一起作为URL参数传递:

  • 不在
    站点上搜索的一般查询的URL将为
    http://yoursite.com/search?q=your_query_string
  • 查询
    stand\u developed==TRUE
    的URL将为
    http://yoursite.com/search?q=your_query_string&stand_developed=1
  • 查询
    stand\u developed==FALSE
    的URL将为
    http://yoursite.com/search?q=your_query_string&stand_developed=0
  • 然后,在控制器中,您可以执行以下操作:

    if params[:stand_developed]  && params[:stand_developed].to_i == 1
      # perform query search with stand_developed == true
      @search_results = YourModel.search(params[:q], :with => {:stand_developed => true})
    elsif params[:stand_developed]  && params[:stand_developed].to_i == 0
      # perform query search with stand_developed == false
      @search_results = YourModel.search(params[:q], :with => {:stand_developed => false})
    else
      # perform general query search
      @search_results = YourModel.search(params[:q])
    end
    

    我现在想出了一个解决办法

    我尝试了我在问题中提到的“破解”——解析单词“stand”并显式搜索它(Paul Davis答案的变体),但效果不太好

    我没有在我的问题中解释这一点(当时我问的时候没有意识到全部含义),但如果用户在他们的食谱描述中也使用了“站立”这个词,我也需要匹配

    因此,我试图让sphinx添加一个条件,大致是“如果stand_developed为true,或者notes包含'stand'”,但我似乎找不到正确的语法。 它还必须处理任何其他搜索文本

    最后,我在我的配方表中添加了一个额外的列,称为“搜索标签”,如果用户在添加配方时选择了“stand_developed”,我会在其中添加“stand”。
    然后,我让Sphinx为该字段以及我的其他字段编制索引,这一切都很完美。

    您可以测试params[:search]是否包含文本“stand”,然后从那里执行搜索。表中不需要额外的列,这只是不需要的开销

    if params[:search].downcase.include?('stand')
      Model.search params[:search], :with => {:stand_developed => true}
    else
      Model.search params[:search]
    end