【问题标题】:Elastic Search nested嵌套的弹性搜索
【发布时间】:2012-07-15 12:59:52
【问题描述】:

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

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

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

【问题讨论】:

  • 我的建议是远离父/子,只是将类别非规范化到记录中,作为 ID/名称/等数组。一旦你开始工作,你就可以继续使用嵌套或父/子功能。

标签: ruby-on-rails elasticsearch tire


【解决方案1】:

恐怕我不知道您的映射定义是什么意思。如果您只是发布以下输出,则会更容易阅读:

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

【讨论】:

    【解决方案2】:

    点运算符可用于访问嵌套数据。

    你可以试试这样的:

    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/

    【讨论】:

      猜你喜欢
      • 2021-09-01
      • 2015-09-24
      • 2011-08-30
      • 2020-10-01
      • 1970-01-01
      • 2017-06-11
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多