0

我正在为 Elastic Search 6.2.2 使用高级 REST 客户端。假设我在索引“DOCUMENTS”中有两个文档,类型为“DOCUMENTS”,它们是

{
   "_id": 1,
   "Name": "John",
   "FunFacts": {
       "FavColor": "Green",
       "Age": 32
   }
},
{
   "_id": 2,
   "Name": "Amy",
   "FunFacts": {
       "FavFood": "Pizza",
       "Age": 33
   }
}

我想找出所有不同的有趣事实及其不同的价值,最终返回一个最终结果

{
    "FavColor": ["Green"],
    "Age": [32, 33],
    "FavFood": ["Pizza"]
}

这可以要求对 Elastic Search 进行多个查询,但我更喜欢只有一个查询。此外,Elastic Search 索引可能会变得相当大,因此我必须在 ES 实例上强制执行尽可能多的操作。

这段代码似乎生成了一个仅包含FunFacts但我仍然必须自己执行聚合的文档列表,这是非常非常不可取的

SearchRequest searchRequest = new SearchRequest("DOCUMENTS");
searchRequest.types("DOCUMENTS");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
String [] includes = new String[1];
includes[0] = "FunFacts";
String [] excludes = new String[1];
excludes[0] = "Name";
searchSourceBuilder.fetchSource(includes, excludes);
searchRequest.source(searchSourceBuilder);

SearchResponse searchResponse =
    restHighLevelClient.search(searchRequest);

谁能指出我正确的方向?我注意到几乎所有的 Elastic Search 文档都以curl命令的形式出现,这对我没有帮助,因为我不够精通将这些命令翻译成 JAVA。

这是你的情节转折。由于允许用户决定他们的有趣事实,我们无法提前知道FunFactsMap 内部的键是什么。:/

谢谢,马特

4

1 回答 1

0

您可以使用聚合在一个查询中完成所有操作。假设您的索引中有以下文档

{
   "Name": "Jake",
   "FunFacts": {
       "FavFood": "Burgers",
       "Age": 32
   }
}

{
   "Name": "Amy",
   "FunFacts": {
       "FavFood": "Pizza",
       "Age": 33
   }
}

{
   "Name": "Alex",
   "FunFacts": {
       "FavFood": "Burgers",
       "Age": 28
   }
}

,并且您想获得不同的“FavFood”选择,您可以使用以下术语聚合来实现(有关此主题的文档

{
  "aggs": {
    "disticnt_fun_facts": {
      "terms": { "field": "FunFacts.FavFood" }
    }
  }
}

,这将导致一些类似的事情

{
  ...
  "hits": { ... },
  "aggregations": {
    "disticnt_fun_facts": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "burgers",
          "doc_count": 2
        },
        {
          "key": "pizza",
          "doc_count": 1
        }
      ]
    }
  }
}

为简洁起见,我只是将聚合部分留在了结果响应中,因此要注意的重要一点是buckets数组,它表示找到的每个不同的术语key,以及它们在文档中出现的次数doc_count

希望有帮助。

于 2018-04-18T16:15:15.863 回答