2

我需要一些帮助:我必须构建以下 URL 才能执行针对 Apache Solr 实例的查询:

http://localhost:8080/solr/select?q=*%3A*&fq=deal_discount%3A[20+TO+*]&fq=deal_price%3A[*+TO+100]&fq={!geofilt+pt%3D45.6574%2C9.9627+sfield%3Dlocation_latlng+d%3D600}

如您所见,URL 包含名为“fq”的参数的 3 倍。我只是想知道如何使用 URI.parse() 方法,如果我需要在作为 parse() 方法的第二个参数的哈希中传递三倍的参数“fq”。

这是一个简单的片段:

path = 'http://localhost:8080/solr/select'
pars = { 'fq' => 'deal_price [* TO 100]', 'fq' => '{!geofilt pt=45.6574,9.9627 sfield=location_latlng d=600}' } # This is obviously wrong!
res = Net::HTTP::post_form( URI.parse(path), pars )

解决方案是将完整的 URL 作为字符串传递,但我找不到提供这种签名的方法。

您能否为我的问题发布一个简单的解决方案?提前致谢。

4

2 回答 2

1

谢谢你的帮助。是的,你是对的......我需要一个 get 方法。无论如何,我不得不对您的代码进行一些更改,因为 Net:HTTP.get() 抛出异常“未知方法主机名”

uri = URI(solrUrl)
req = Net::HTTP::Get.new(uri.request_uri)
res = Net::HTTP.start(uri.hostname, uri.port) {|http|
   http.request(req)
}

这解决了我的问题。确实谢谢。

于 2012-12-08T21:56:11.490 回答
0

您的 URL 建议您应该使用 HTTP GET 来查询 solr,而您的代码片段使用 POST,这是需要更改的一件事。但我认为您的主要问题在于参数,哈希可能只包含一个键条目,因此在这种情况下您不能使用哈希。一种简单的方法是手动构建 URL。

params_array = ['deal_price [* TO 100]', 
  '{!geofilt pt=45.6574,9.9627 sfield=location_latlng d=600}']
base_url = "http://localhost:8080/solr/select"
query_string = "?fq=#{params_array.join('&fq=')}"
url = base_url + query_string
result = Net::HTTP.get url

可能有点紧凑 - 更易读的版本可能是(根据口味):

params_array = ['deal_price [* TO 100]', 
  '{!geofilt pt=45.6574,9.9627 sfield=location_latlng d=600}']
url = "http://localhost:8080/solr/select&"
params_array.each do |param|
  url << "&fq=#{param}"
end
result = Net::HTTP.get url
于 2012-12-08T20:17:27.503 回答