我需要一些帮助:我必须构建以下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()方法的第二个参数的Hash中传递参数“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作为String传递,但我找不到提供此类签名的方法。
请问一个简单的解决方案来解决我的问题?在此先感谢。
答案 0 :(得分:1)
请求你的帮助。是的,你是对的...我需要一个get方法。无论如何,我不得不对你的代码做一点改动,因为Net:HTTP.get()引发了异常“Unknown method hostname”
uri = URI(solrUrl)
req = Net::HTTP::Get.new(uri.request_uri)
res = Net::HTTP.start(uri.hostname, uri.port) {|http|
http.request(req)
}
这解决了我的问题。非常感谢。
答案 1 :(得分:0)
您的网址建议您在代码段使用POST时使用HTTP GET查询solr,这是一件可以改变的事情。但我认为你的主要问题是参数,哈希可能只包含一个键的一个条目,因此在这种情况下你不能使用哈希。一种简单的方法是手动构建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