如何防止太阳黑子,Solr在params [:search] =“”时返回所有记录

时间:2013-01-17 20:43:31

标签: ruby-on-rails solr sunspot railscasts

我刚开始学习使用Sunspot / Solr和Rails。

我跟着这个RailsCast http://railscasts.com/episodes/278-search-with-sunspot

当我没有搜索查询且搜索字段为空时,Solr默认返回文章模型中的所有结果。

这是我的ArticlesController #index

def index
    @search = Article.search do
      fulltext params[:search]
    end
    @articles = Article.all
    @search_results = @search.results
end

当在搜索栏中输入没有参数并且只是“”时,控制台输出以下内容:

Started GET "/articles?utf8=%E2%9C%93&search=" for 127.0.0.1 at 2013-01-17 12:28:09 -0800
  Processing by ArticlesController#index as HTML
  Parameters: {"utf8"=>"✓", "search"=>""}
  SOLR Request (17.0ms)  [ path=#<RSolr::Client:0x007f9b5a6643e0> parameters={data: fq=type%3AArticle&start=0&rows=30&q=%2A%3A%2A, method: post, params: {:wt=>:ruby}, query: wt=ruby, headers: {"Content-Type"=>"application/x-www-form-urlencoded; charset=UTF-8"}, path: select, uri: http://localhost:8982/solr/select?wt=ruby, open_timeout: , read_timeout: } ]
  Article Load (0.4ms)  SELECT "articles".* FROM "articles"
  Article Load (0.4ms)  SELECT "articles".* FROM "articles" WHERE "articles"."id" IN (1, 2, 3, 4, 5, 6, 7, 8)
Rendered articles/index.html.erb within layouts/application (7.6ms)
Completed 200 OK in 74ms (Views: 10.8ms | ActiveRecord: 0.8ms | Solr: 17.0ms)
[2013-01-17 12:28:09] WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true

除非给出搜索词,否则我想要的行为是什么都不返回。 我尝试修改ArticlesController #index,如下所示:

def index
    if params[:search] = ""
      @search_results = []

    else
      @search = Article.search do
        fulltext params[:search]
      end
      @search_results = @search.results

    end
    @articles = Article.all
  end

在这种情况下,当我在搜索字段中输入任何内容以便param[:search] = ""时,Solr不会返回任何内容,这是所需的行为。

Started GET "/articles?utf8=%E2%9C%93&search=" for 127.0.0.1 at 2013-01-18 12:02:52 -0800
  Processing by ArticlesController#index as HTML
  Parameters: {"utf8"=>"✓", "search"=>""}
  Article Load (0.5ms)  SELECT "articles".* FROM "articles"
Rendered articles/index.html.erb within layouts/application (11.1ms)
Completed 200 OK in 23ms (Views: 14.1ms | ActiveRecord: 0.5ms | Solr: 0.0ms)
[2013-01-18 12:02:52] WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true

但是,当我输入搜索词“ruby”以便param[:search] = "ruby"时,不返回任何内容,而且根本没有调用Solr。

Started GET "/articles?utf8=%E2%9C%93&search=ruby" for 127.0.0.1 at 2013-01-17 12:37:58 -0800
  Processing by ArticlesController#index as HTML
  Parameters: {"utf8"=>"✓", "search"=>"ruby"}
  Article Load (0.5ms)  SELECT "articles".* FROM "articles"
Rendered articles/index.html.erb within layouts/application (11.5ms)
Completed 200 OK in 23ms (Views: 14.5ms | ActiveRecord: 0.5ms | Solr: 0.0ms)
[2013-01-17 12:37:58] WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true

我的条件逻辑有问题吗?或者,我错过了Solr的工作原理吗?谢谢!

1 个答案:

答案 0 :(得分:1)

Solr模式定义了在没有提供defaultQuery参数时要运行的q,或者它的值是一个空字符串。

太阳黑子的defaultQuery*:*(match-all-docs查询);此外,当*:*提供空字符串时,太阳黑子本身会更明确地发送fulltext

如果您不想在这种情况下使用match-all-documents查询,最好在控制器中检查用户提供的查询,并完全跳过对Solr的调用。

这实际上正是你在你的例子中所做的,所以我可能不清楚真正的问题。你说,“我想要的行为是无可归还的”,然后,描述你的条件,“有了这个条件,什么也没有回来。”好像你已经解决了自己的问题?


编辑,澄清:

除非这是拼写错误,否则您可能希望将if params[:search] = ""更改为if params[:search] == ""。注意相等与赋值运算符。

(或者,更好的是:params[:search].blank?