我正在处理的Rails项目正在使用Solr搜索,但在输入某些数据时,搜索功能不会返回结果。
如果传递了电子邮件,guid(全球唯一标识符),电话号码或客户信用卡的最后4个,搜索功能应返回结果。目前它只适用于电子邮件或guid。
我甚至不知道从哪里开始排除故障,因为每当我搜索Solr搜索时,我只返回项目未使用的太阳黑子宝石的结果。
应用程序控制器中包含的Solr搜索模块如下所示:
module SolrSearch
def solr_query(query_string)
query_string << "&fq=publisher_name:#{UMS[:publisher_name]}"
uri = SOLR_URL + "/select/?version=2.2&start=0&rows=100&indent=on&qt=dismax&wt=json&fl=id,guid,email,user_name,publisher_name,csg_id,state,created_at&q=#{query_string.downcase.strip}"
response = Curl::Easy.http_get(URI.escape(uri))
result = JSON.parse(response.body_str)
return result
end
end
如果我没有在搜索字段中输入任何内容,我会使用guid,user_name,email,publisher_name,state和created_at返回一组用户。
我的gemfile看起来像:
source 'https://rubygems.org'
gem 'rails', '3.2.13'
gem "cancan"
gem 'curb', '0.8.1'
gem 'haml', '4.0.0'
gem 'jquery-rails'
gem 'json', '1.7.7'
gem 'oauth', '0.4.7'
gem 'ohm'
gem 'omniauth', '>= 1.0.0'
gem "omniauth_crowd", '2.1.1'
gem 'recurly', :git => "https://github.com/sherbet/recurly-client-ruby.git", :branch => 'sherbet-2.1.9.4'
gem 'redis'
gem 'sidekiq', '3.2.1'
gem 'rest-client', '~> 1.7.2'
gem 'slim', '>= 1.1.0'
gem 'sinatra', '>= 1.3.0', :require => nil
gem 'typhoeus', '0.5.3'
gem 'money'
gem 'newrelic_rpm'
gem 'uuidtools', '2.1.3'
gem "vertex", :git => "git@github.com:sherbet/vertex.git", :branch => "releases/1.0.0"
gem 'unicorn'
gem 'whenever', :require => false
gem 'cellophane', :git => "git@github.com:sherbet/cellophane.git", :require => 'cellophane', :branch => "convert_gem"
# Gems used only for assets and not required
# in production environments by default.
group :assets do
gem 'sass-rails', '~> 3.2.3'
gem 'coffee-rails', '~> 3.2.1'
gem 'uglifier', '>= 1.0.3'
end
group :development do
gem 'pry'
gem 'pry-doc'
gem 'pry-rails'
gem 'pry-nav'
end
# For Code Climate
gem "codeclimate-test-reporter", group: :test, require: nil
group :test do
gem 'cucumber-rails', '1.4.0', :require => false
gem 'rspec-rails'
gem 'pickle', '0.4.11'
gem 'capybara', '2.2.1'
gem 'chromedriver-helper'
gem 'launchy', '2.4.2'
gem 'selenium-webdriver', '2.41.0'
gem 'timecop', '0.7.1'
gem 'vcr', '2.9.0'
gem 'webmock', '1.17.4'
gem 'factory_girl_rails','~> 4.0'
gem 'database_cleaner', '1.2.0'
gem 'json_spec', '~> 1.1'
gem 'simplecov'
gem 'simplecov-rcov'
end
group :development, :test do
gem 'ci_reporter_cucumber'
gem 'ci_reporter_rspec'
gem 'capistrano-rails'
gem 'capistrano3-unicorn'
gem 'capistrano-bundler'
gem 'capistrano-rvm'
end
显然我已经尝试将phone_number添加到URI字符串中,但这不起作用。
我该如何开始对此进行故障排除?
根据Tinman的建议,我尝试使用URI类对查询字符串进行编码。我做了:
module SolrSearch
require 'uri'
def solr_query(query_string)
uri = URI.parse(SOLR_ICEBOX_URL)
uri.query = URI.encode_www_form(
'fq' => "publisher_name:#{UMS[:publisher_name]}",
'version' => 2.2,
'start' => 0,
'rows' => 100,
'indent' => 'on',
'qt' => 'dismax',
'wt' => 'json',
'fl' => 'id,guid,email,user_name,publisher_name,csg_id,state,created_at',
'q' => query_string.downcase.strip
)
result = JSON.parse(response.body)
end
end
答案 0 :(得分:1)
至于构建URL,不要使用字符串连接或插值,除非你绝对确定结果字符串是否正确编码。
相反,我建议利用内置的URI类,它将为您解决这个问题:
require 'uri'
SOLR_URL = 'http://somehost.com/select/'
UMS = {publisher_name: 'some company'}
query_string = 'foo bar'
uri = URI.parse(SOLR_URL)
uri.query = URI.encode_www_form(
'fq' => "publisher_name:#{UMS[:publisher_name]}",
'version' => 2.2,
'start' => 0,
'rows' => 100,
'indent' => 'on',
'qt' => 'dismax',
'wt' => 'json',
'fl' => 'id,guid,email,user_name,publisher_name,csg_id,state,created_at',
'q' => query_string.downcase.strip
)
运行会导致uri
看起来像:
uri.to_s
# => "http://somehost.com/select/?fq=publisher_name%3Asome+company&version=2.2&start=0&rows=100&indent=on&qt=dismax&wt=json&fl=id%2Cguid%2Cemail%2Cuser_name%2Cpublisher_name%2Ccsg_id%2Cstate%2Ccreated_at&q=foo+bar"