【问题标题】:elasticsearch unable to query path in rubyelasticsearch无法在ruby中查询路径
【发布时间】:2015-07-19 12:15:30
【问题描述】:

我有一个弹性搜索索引“事件” - 在该索引中有一个类型“事件”。

事件对象有一个“地点”,它具有各种属性,包括一个“名称” - 所以简化的结构是:

event {
  venue {
    name: "foo"
  }
}

现在,我正在使用 elasticsearch-rails - 使用查询 dsl 列出事件、搜索等一切正常 - 但是如果我想列出具有特定名称的场地的所有事件怎么办?

我假设这样的事情应该是可能的:

Event.search "{ 'query': { 'match': { 'venue.name': '#{params[:v]}' }}}

但我收到以下错误:

Elasticsearch::Transport::Transport::Errors::BadRequest

随后是包含大量此类内容的大量堆栈跟踪:

Was expecting one of:\n    \"]\" ...\n    \"}\" ...\n    ];

ParseExceptions 提示 json 格式错误 - 但我不知道为什么。

简单的搜索

Event.search '{"query" : { "match_all" : {} }}'

工作正常,所以我猜这只是查询的结构错误。

我尝试过切换单引号/双引号,尝试更密切地关注此页面上的示例:

https://www.elastic.co/guide/en/elasticsearch/guide/current/denormalization.html

一切都无济于事,想知道是否有其他人遇到过这种情况并可以建议如何在 ruby​​ 中工作。

【问题讨论】:

    标签: ruby-on-rails ruby elasticsearch-rails elasticsearch-model


    【解决方案1】:

    您尝试传递给搜索功能的 Json 不是有效的 Json。您可以尝试将哈希而不是 Json 传递给搜索功能。请尝试以下操作:

    query_hash = {query: {match: {'venue.name' => params[:v] }}}
    Event.search query_hash
    

    【讨论】:

    • 完美运行,谢谢 - 我确信我已经尝试过这个确切的解决方案,但一定没有。不管怎样,谢谢你
    【解决方案2】:

    Elasticsearch 的 json 解析器不会使用单引号来分隔字符串 - 虽然一些后来的解析器可能会,但这不是标准的一部分。

    您当然可以避开它们,尽管这会使事情变得不那么清晰,因此使用另一种引用形式可能更可取:

    %< {"query": { "match": { "venue.name": "#{params[:v]}"}}} >
    

    但是,最好将查询表示为 ruby​​ 哈希,然后将其转换为 json(例如,上面的 sn-p 不能正确转义提交值中的特殊字符)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 2017-03-06
      相关资源
      最近更新 更多