2012-07-16 175 views
0

我正在使用彈性搜索輪胎寶石。彈性搜索嵌套

鑑於這種結構,索引我的資源模型

mapping do 
    indexes :_id 
    indexes :version,    analyzer: 'snowball', boost: 100 
    indexes :resource_files do 
    indexes :_id 
    indexes :name,    analyzer: 'snowball', boost: 100 
    indexes :resource_file_category do 
     indexes :_id 
     indexes :name,    analyzer: 'snowball', boost: 100 
    end 
    end 
end 

我怎樣才能檢索到所有具有給定的resource_file_category ID resource_files的資源?

我看了在彈性搜索文檔,我認爲可以使用具有子過濾 http://www.elasticsearch.org/guide/reference/query-dsl/has-child-filter.html

我已經嘗試過這種方式

filter :has_child, :type => 'resource_files', :query => {:filter => {:has_child => {:type => 'resource_file_category', :query => {:filter => {:term => {'_id' => params[:resource_file_category_id]}}}}}} 

,但如果是我不知道可能/有效做一個「嵌套的has_child過濾器」,或者如果有更好/更簡單的方法來做到這一點...任何建議是值得歡迎的)

+0

我的建議是從父/子遠離,只是非規範化的類別到的記錄,作爲IDS /名稱的數組/等。一旦你得到這個工作,你可以繼續使用嵌套或父/子功能。 – karmi 2012-07-25 10:55:25

回答

2

恐怕我不知道你的映射定義是什麼意思。這將會是更易於閱讀,如果你剛剛發佈的輸出:

curl -XGET 'http://127.0.0.1:9200/YOUR_INDEX/_mapping?pretty=1' 

但你可能想是這樣的:

curl -XGET 'http://127.0.0.1:9200/YOUR_INDEX/YOUR_TYPE/_search?pretty=1' -d ' 
{ 
    "query" : { 
     "term" : { 
     "resource_files.resource_file_catagory._id" : "YOUR VALUE" 
     } 
    } 
} 
' 

注:_id領域或許應該被映射爲{"index": "not_analyzed"}使他們不會被分析,而是存儲確切的值。否則,如果您'FOO BAR'term查詢的文檔不會被發現,因爲存儲的實際條件是:['foo','bar']

注:has_child查詢用來搜索誰擁有孩子的文檔父文檔(即文檔它們指定了父類型和ID),它們符合特定的搜索條件。

0

點運算符可用於訪問嵌套數據。

你可以嘗試這樣的事情:

curl -XGET 'http://loclahost:port/INDEX/TYPE/_search?pretty=1' -d 
'{ 
    "query": { 
    "match": { 
     "resource_files.resource_file_catagory.name": "VALUE" 
     } 
    } 
}' 

如果resource_file_catagory是non_analyzed沒有標記化並作爲一個單一的值存儲的值,從而給你一個準確的匹配。

您還可以使用elasticsearch-head插件進行數據驗證並查詢建築物參考。

https://www.elastic.co/guide/en/elasticsearch/reference/1.4/modules-plugins.htmlhttps://mobz.github.io/elasticsearch-head/