弹性搜索嵌套

时间:2012-07-16 16:19:31

标签: ruby-on-rails elasticsearch tire

我正在通过轮胎宝石使用弹性搜索。

给定这个结构来索引我的资源模型

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

2 个答案:

答案 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.htmlhttps://mobz.github.io/elasticsearch-head/