-->

弹性搜索嵌套(Elastic Search nested)

2019-10-17 00:34发布

我使用过的轮胎的宝石弹性搜索。

鉴于这种结构,索引我的资源模型

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

Answer 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"}使他们没有得到分析,而是存储精确的数值。 否则,如果你做一个term的查询'FOO BAR'的文档不会被发现,因为存储的实际条件是: ['foo','bar']

注: has_child查询用来搜索谁拥有(其指定父类型和ID即文档)子文档符合特定搜索标准的父文档。



Answer 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头插件数据验证,还可以查询建设参考。

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



文章来源: Elastic Search nested