2017-07-21 111 views
0

我已经在elasticsearch中存储了三个json对象,每个对象都有一个titleprojects数组。如何在elasticsearch的特定索引处获取元素?

{"name": "haris","projects": [{"title": "Splunk"},{"title": "QRadar"},{"title": "LogAnalysis"}]} 

{"name": "khalid","projects": [{"title": "MS"},{"title": "Google"},{"title": "Apple"}]} 

{"name": "Hamid","projects": [{"title": "Toyota"},{"title": "Honda"},{"title": "Kia"}]} 

我写了一个查询通过_id提取特定的对象和它的具体特点projects

curl -XGET 'localhost:9200/jsontest/_search?pretty' -d '{"query" : { "match" : {"_id":"AV1kzzZqAzHWQ2S7B8f1"} }, "_source": ["projects"]}' 

正如预期的那样,它返回项目对象

{ "took" : 3, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 1.0, "hits" : [ { "_index" : "jsontest", "_type" : "json", "_id" : "AV1kzzZqAzHWQ2S7B8f1", "_score" : 1.0, "_source" : { "projects" : [{"title" : "Splunk"},{"title" : "QRadar"},{"title" : "LogAnalysis"} ] } } ] } }

问题:有没有办法在特定的i上检索价值projects?这是虚拟数据,在我的真实场景projects可以有大量的元素,每个元素本身是一个具有很多属性的JSON对象。我只需要检索projects的某个索引值。

+0

只是要清楚你想从项目数组的其中一个元素返回某个字段,但是你不想返回整个项目数组元素?如果是这种情况,只需通过'inner_hits' [Elasticsearch Inner Hits]扩展查询来实现这一点(https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-inner-hits .html#nested-inner-hits) –

+0

@UlugToprak不,我不想从某个元素获得某个字段,我想要数组的完整元素 –

回答

0

这是我会做的。

首先映射

PUT test/my_objects/_mapping 
{ 
    "properties": { 
    "name":{ 
     "type": "string", 
     "index": "not_analyzed" 
    }, 
    "projects": { 
     "type": "nested" 
    } 
    } 
} 

二项目进行索引

PUT test/my_objects/1111 
{ 
"name": "haris", 
     "projects": [ 
       {"title": "Splunk"}, 
       {"title": "QRadar"}, 
       {"title": "LogAnalysis"} 
] 
} 

最后聚集查询

GET test/my_objects/_search 

{ 
    "aggs": { 
    "by_name": { 
     "terms": { 
     "field": "name" 
     }, 
     "aggs": { 
     "by_project": { 
      "nested": { 
      "path": "projects" 
      }, 
      "aggs": { 
      "by_title": { 
       "terms": { 
       "field": "projects.title" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

它不是测试,还真有点麻烦,因为嵌套AGGS的,但应如果你进一步为你操作,需要工作

相关问题