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 过滤器”,或者是否有更好/更简单的方法来做到这一点......欢迎任何建议;)

4

2 回答 2

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 的文档)的父文档。

于 2012-07-16T17:33:31.053 回答
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/

于 2016-02-24T22:53:30.300 回答