仅当key1 = value1和key2 = value2不存在另一个文档,其中key1 = value1和key2 = value3时,才从Elastic获取所有文档

时间:2019-07-19 08:25:46

标签: java elasticsearch

我正在尝试使用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来获得这种欲望吗?如果是哪种方法更有效,那我现在的方法还是新方法?

1 个答案:

答案 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