【问题标题】:Troubleshooting Solr search in Rails projectRails 项目中的 Solr 搜索疑难解答
【发布时间】:2015-01-16 16:48:52
【问题描述】:

我正在处理的 Rails 项目正在使用 Solr 搜索,但在输入某些数据时搜索功能不会返回结果。

如果传递了电子邮件、guid(全局唯一标识符)、电话号码或客户信用卡的最后 4 位,则搜索功能应返回结果。目前它只适用于电子邮件或 guid。

我什至不知道从哪里开始进行故障排除,因为每次我搜索 Solr 搜索时,我都会返回项目未使用的太阳黑子 gem 的结果。

应用控制器中包含的 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

【问题讨论】:

  • 没有必要用“编辑:”标记部分。如果我们好奇的话,我们可以看到编辑历史。相反,我使用“---”(3 个破折号)在输出中强制使用 &lt;hr&gt; 标记,这样就可以进行某种描述,而不会像“编辑:”那样明显

标签: ruby-on-rails ruby solr


【解决方案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"

【讨论】:

  • 当我这样设置时,response.body 是一个空字符串,但它仍然返回 200。我将更新原始帖子以准确显示我所做的,以防我错过了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2014-08-29
  • 2011-10-27
相关资源
最近更新 更多