如何使用gem将多个查询参数传递给弹性搜索?

时间:2013-10-23 17:20:06

标签: ruby-on-rails-3.2 elasticsearch query-parameters

我需要在查询中将带有特殊章程的字符串附加到rails中的elasticsearch。我尝试使用.html_saferaw()它不会破坏任何内容,但它仍然以十六进制或其他方式传递给章程。

这些都将同样的东西传递给elasticsearch

<%= @esearch.search q:params[:query] + '&pretty=true' do %>

<%= @esearch.search q:params[:query] + '&pretty=true'.html_safe do %>

<%= @esearch.search q:params[:query] + raw('&pretty=true') do %>

我得到了这个:

q=asa%26pretty%3Dtrue

我希望得到这个:

q=asa&pretty=true

1 个答案:

答案 0 :(得分:0)

您没有遇到html转义问题。只有在直接打印到用户的浏览器时不希望输出转义时,rawhtml_safe才有用。例如,如果遇到html-escaping问题,params会输出q=asa&amp;pretty=true,但你不是。

您看到的是输出网址安全值的CGI.escape的结果。

它(根据您当前使用的search方法)向我看,哈希选项被转换为查询参数。你试过这个:

@esearch.search q: params[:query], pretty: true

我不确定search正在做什么,但这似乎是一种在视图中直接使用的奇怪方法。当然我可能错了,因为我不确切知道它在做什么。

更新:

点击此处的文档:https://github.com/elasticsearch/elasticsearch-ruby/blob/master/elasticsearch-api/lib/elasticsearch/api/actions/search.rb#L15

有两种发送查询参数的方法,看起来像。一种是使用q: 'title:text'格式,这就是您发送params[:query]的内容(但看起来您的查询只是'asa'所以我不确定您是否使用了正确的格式?),另一个是通过body哈希:

@esearch.search body: {
  query: { match: { title: 'test' } },
  facets: { tags: { terms: { field: 'tags' } } }
}

您应该查看该文档,包括弹性搜索选项文档的链接,并找出发送它所需的内容。我没有在文档中看到pretty: true选项,所以不确定它是什么。但是有很多文档,而且我并没有真正地看到它们,我会把它留给你。