Elasticsearch获得满足两个条件的元素

时间:2015-07-09 12:31:02

标签: elasticsearch

我在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中的日期。

1 个答案:

答案 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条件,iddate必须匹配文档。

构造一个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

的文档