Elastic Search nested

社会主义新天地 提交于 2019-12-25 18:21:45

问题


I'm using Elastic search through tire gem.

Given this structure to index my resource model

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

How can i retrieve all the resources that have resource_files with a given resource_file_category id?

i've looked in the elastic search docs and i think could be using the has child filter http://www.elasticsearch.org/guide/reference/query-dsl/has-child-filter.html

i've tried this way

filter :has_child, :type => 'resource_files', :query => {:filter => {:has_child => {:type => 'resource_file_category', :query => {:filter => {:term => {'_id' => params[:resource_file_category_id]}}}}}}

but i'm not sure if is possible/valid to make a "nested has_child filter" or if is there a better/simpler way to do this... any advice is welcome ;)


回答1:


I'm afraid I don't know what your mapping definition means. It'd be easier to read if you just posted the output of:

curl -XGET 'http://127.0.0.1:9200/YOUR_INDEX/_mapping?pretty=1' 

But you probably want something like this:

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"
      }
   }
}
'

Note: The _id fields should probably be mapped as {"index": "not_analyzed"} so that they don't get analyzed, but instead store the exact value. Otherwise if you do a term query for 'FOO BAR' the doc won't be found, because the actual terms that are stored are: ['foo','bar']

Note: The has_child query is used to search for parent docs who have child docs (ie docs which specify a parent type and ID) that match certain search criteria.




回答2:


The dot operator can be used to access nested data.

You can try something like this:

curl -XGET 'http://loclahost:port/INDEX/TYPE/_search?pretty=1'  -d 
'{
   "query": {
     "match": {
        "resource_files.resource_file_catagory.name": "VALUE"
      }
   }
 }'

If resource_file_catagory is non_analyzed the value is not tokenized and stored as a single value, hence giving you an exact match.

You can also use elasticsearch-head plugin for data validation and also query building reference.

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



来源:https://stackoverflow.com/questions/11508389/elastic-search-nested

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!