我刚开始学习使用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的工作原理吗?谢谢!
答案 0 :(得分:1)
Solr模式定义了在没有提供defaultQuery
参数时要运行的q
,或者它的值是一个空字符串。
太阳黑子的defaultQuery
是*:*
(match-all-docs查询);此外,当*:*
提供空字符串时,太阳黑子本身会更明确地发送fulltext
。
如果您不想在这种情况下使用match-all-documents查询,最好在控制器中检查用户提供的查询,并完全跳过对Solr的调用。
这实际上正是你在你的例子中所做的,所以我可能不清楚真正的问题。你说,“我想要的行为是无可归还的”,然后,描述你的条件,“有了这个条件,什么也没有回来。”好像你已经解决了自己的问题?
编辑,澄清:
除非这是拼写错误,否则您可能希望将if params[:search] = ""
更改为if params[:search] == ""
。注意相等与赋值运算符。
(或者,更好的是:params[:search].blank?
)