将一个布尔字段索引为sphinx中的字符串

时间:2010-01-24 16:31:35

标签: ruby-on-rails thinking-sphinx

我有a Ruby on Rails site使用思维sphinx搜索postgres数据库。

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

用一个例子充分解释:
我的网站适合那些开发自己的黑白电影的人 我有一张食谱表,供人们描述他们如何开发一部电影。该表有一个名为“stand_developed”的布尔列(一种开发电影的方法) 当用户搜索单词“stand”时,我想返回该字段为真的结果。

我已经通过了sphinx docs并且没有真正找到它是否可能。

我想我可以通过解析查询术语并添加条件来破解我的控制器方法中的某些内容但是有更清晰的方法吗?

3 个答案:

答案 0 :(得分:1)

就我使用ThinkingSphinx搜索布尔字段而言,这就是我所做的。通过以下方式将stand_developed作为URL参数与query_string一起传递:

  1. 未在stand_developed上搜索的常规查询的网址将为http://yoursite.com/search?q=your_query_string
  2. stand_developed == TRUE查询的网址为http://yoursite.com/search?q=your_query_string&stand_developed=1
  3. stand_developed == FALSE查询的网址为http://yoursite.com/search?q=your_query_string&stand_developed=0
  4. 然后,在你的控制器中,你会这样做:

    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
    

答案 1 :(得分:1)

如果params [:search]包含文本'stand'然后从那里完成搜索,你可能刚刚测试过。您的表中不需要额外的列,这只是不需要的开销。

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

答案 2 :(得分:0)

我现在想出了解决方案。

我尝试了我在问题中提到的“hack” - 解析“stand”这个词并明确地搜索它(保罗戴维斯答案的一个变体)但是效果并不好。

我没有在我的问题中解释这个问题(在我问的时候没有意识到这一点)但如果用户也在他们的食谱描述中使用了“stand”这个词,我还需要它。

所以,我试图让sphinx添加条件“如果stand_developed为true或者notes包含'stand'”,但我似乎找不到合适的语法。 它也必须处理任何其他搜索文本。

最后,我在配方表中添加了一个名为“search_tags”的额外列,如果用户在添加配方时选择“stand_developed”,我会在其中添加“stand”字样。 然后我让Sphinx将该字段以及其他字段编入索引,这一切都完美无缺。