我正在尝试使用Elastic的RestHighLevelClient for Java检索某些文档。目前,我需要根据某些条件检索文档。
有些行业,我的文件中包含以下信息
id = 1, status = SUCCESS
id = 2, status = SUCCESS
id = 1, status = CANCELLED
现在,我需要检索所有成功但未被取消的交易。
当前,我的方法是在JAVA中分别获取成功交易和已取消交易,然后从成功交易中删除所有已取消交易。
我使用这些查询生成:
query1 = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("status", "success"))
query2 = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("status", "cancelled"))
然后生成
List<Trade> Success, List<Trade> Cancelled
List<Trade> SuccessButNotCancelled
通过循环两者
有什么方法可以通过简单地查询Elastic来获得这种欲望吗?如果是哪种方法更有效,那我现在的方法还是新方法?
答案 0 :(得分:0)
您可以通过status
字段汇总结果。这样一来,您将有两个来自Elastic的数据集。一个带有success
,另一个带有cancelled
。
对于SuccessButNotCancelled
,您可以在这两个结果集上使用java逻辑。我要说的是,如果您的结果大小很大,那么最好再次请求弹性来检索SuccessButNotCancelled
。
为此,您可以将查询用作:
BoolQueryBuilder successButNotCancelled = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("status", "success"))
.mustNot(QueryBuilders.matchQuery("status", "cancelled"));
通过这种方式,您可以在两个弹性调用中进行检索:
List<Trade> Success; //in first call of aggregation
List<Trade> Cancelled; //in first call of aggregation
List<Trade> SuccessButNotCancelled; //using successButNotCancelled