我在db元素中有以下结构:
{
"id": 324214,
"modDate": "2014-10-01",
"otherInfo": {
..
..
}
}
假设我有成对列表[id,modDate]:
Map<String, String> idAndModDate
包含f.e(324214,“2014-10-01”),(3254757,“2015-10-04”)..
现在,我想使用Java Api Elasticsearch QueryBuilder构建Query,结果给出了系统中存在的所有“id”的列表,但是对于谁来说modDate与给定的不同。
假设我在数据库元素中有以下id / date对:
id, date
1, 2015-01-01
2, 2014-03-02
3, 2000-01-22
4, 2020-09-01
现在,我想为
创建查询使用以下数据进行映射:
Map<String, String> idDataPairs =[
(1, 2015-01-01)
(2, 2014-03-03)
(3, 2000-01-22)
(7, 2020-09-01)]
现在我想创建像
这样的功能 List<String> ids = search(Map<String, String>) {
QueryBuilder.(sth).(sth) <--- thats what I'm asking about
}
将返回id:1,3因为这些ID存在于DB中,而来自查询的日期分别等于db中的日期。
答案 0 :(得分:0)
这正是您所寻找的,或多或少。
//build the test data in the map
Map<String, String> idDataPairs = new HashMap<String, String>();
idDataPairs.put("1", "2015-01-01");
idDataPairs.put("2", "2014-03-03");
idDataPairs.put("3", "2000-01-22");
idDataPairs.put("4", "2020-09-01");
//construct the query
BoolQueryBuilder should = QueryBuilders.boolQuery();
for(String id : idDataPairs.keySet()){
BoolQueryBuilder bool = QueryBuilders.boolQuery();
bool.must(QueryBuilders.termQuery("id", id));
bool.must(QueryBuilders.termQuery("modDate", idDataPairs.get(id)));
should.should(bool);
}
should.minimumNumberShouldMatch(1);
我在做什么是这样的:
对于每个Pairs,我正在构建一个名为bool
的BoleanQuery。这个布尔查询有两个must
条件,id
和date
必须匹配文档。
构造一个bool
布尔查询后,我也将它添加到父BooleanQuery中。这次,我说内部bool
查询应匹配,但不需要。最后一行表示,如果我们希望文档匹配,这些查询中至少应有一个匹配。
这个结构更容易理解,因为must
函数像AND和should
函数像OR,但另一种方法是使用TermsQuery,我们构造几个TermsQuerys,然后添加使用should
将它们转换为另一个父BooleanQuery。
所以,对于数据
id, date
1, 2015-01-01
2, 2014-03-02
3, 2000-01-22
4, 2020-09-01
上面的代码将返回包含ids 1,2,3