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(例如上面的代碼片段不能正確地轉義提交的值中的特殊字符)