0

我有一个elasticsearch索引'事件' - 在该索引内有'事件'类型。elasticsearch无法查询红宝石路径

事件对象有一个“场地”,这具有各种属性,包括“名称” - 这样的简单结构为:

event { 
    venue { 
    name: "foo" 
    } 
} 

现在,我使用elasticsearch护栏 - 一切正常上市事件,使用查询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

都无济于事,想知道如果任何人遇到了这种情况,并可以建议如何以红宝石工作。

回答

0

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

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

完美地工作,谢谢 - 我确信我试过这个确切的解决方案,但不能有。无论如何,谢谢 – freeloader

0

Elasticsearch的JSON解析器不会使用单引号来分隔字符串 - 而一些后来解析器的5月,这不是标准的一部分。

你当然可以逃避他们,虽然这使事情变得不那么清晰,所以使用引用的另一种形式是优选的:

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

然而,它的要好得多表示查询作为Ruby哈希和然后将其转换为json(例如上面的代码片段不能正确地转义提交的值中的特殊字符)