Ruby简单Web服务客户端执行对Solr的调用

Ruby简单Web服务客户端执行对Solr的调用,ruby,solr,webservice-client,Ruby,Solr,Webservice Client,在这方面我需要一些帮助:为了针对Apache Solr实例执行查询,我必须构建以下URL: 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倍。我

在这方面我需要一些帮助:为了针对Apache Solr实例执行查询,我必须构建以下URL:

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倍。我只是想知道,如果我需要在parse()方法的第二个参数Hash中传递三次参数“fq”,如何使用URI.parse()方法

下面是一个简单的片段:

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,但我找不到提供这种签名的方法


你能为我的问题贴一个简单的解决方案吗?提前感谢。

您的URL建议您在代码段使用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_数组=['deal_price[*TO 100],
“{!geofilt pt=45.6574,9.9627 sfield=location_latlng d=600}”
url=”http://localhost:8080/solr/select&"
params|u数组。每个do|param|

url谢谢你的帮助。是的,你是对的。。。我需要一个get方法。无论如何,我必须对您的代码做一些更改,因为Net:HTTP.get()引发了一个异常“未知方法主机名”


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

为什么不使用rsolr或sunspot gem?因为如果我可以用几行代码在标准Ruby中实现我想要的功能,我不需要gem。我只用了5行代码就做到了。这只是对Solr的调用。由于组件结果、方面和突出显示是不同的元素,您需要相当多的处理来读取solr xml响应。。。但我没有说这是一个web服务(充当Solr客户机),用于将响应发送回真正的消费者。这是一个web服务,它只是Solr和消费者之间的桥梁。所以我只需要将HTTP响应转发给消费者。
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
uri = URI(solrUrl)
req = Net::HTTP::Get.new(uri.request_uri)
res = Net::HTTP.start(uri.hostname, uri.port) {|http|
   http.request(req)
}