我正在通过轮胎宝石使用弹性搜索。
给定这个结构来索引我的资源模型
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的所有资源?
我查看了弹性搜索文档,我认为可以使用has子过滤器 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 :(得分: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"}
,以便不对其进行分析,而是存储确切的值。否则,如果您对term
进行'FOO BAR'
查询,则无法找到该文档,因为存储的实际字词为:['foo','bar']
注意:has_child
查询用于搜索具有符合特定搜索条件的子文档(即指定父类型和ID的文档)的父文档。
答案 1 :(得分:0)
点运算符可用于访问嵌套数据。
您可以尝试这样的事情:
curl -XGET 'http://loclahost:port/INDEX/TYPE/_search?pretty=1' -d
'{
"query": {
"match": {
"resource_files.resource_file_catagory.name": "VALUE"
}
}
}'
如果resource_file_catagory未经分析,则该值不会被标记化并存储为单个值,因此可以为您提供完全匹配。
您还可以使用elasticsearch-head插件进行数据验证,还可以查询建筑参考。
https://www.elastic.co/guide/en/elasticsearch/reference/1.4/modules-plugins.html或 https://mobz.github.io/elasticsearch-head/