2017-08-17 49 views
0

我有下面这样的查询 -Elasticsearch布尔查询形成具有多个必备子句

{ 
    "query": { 
     "bool": { 
      "must": { 
       "bool" : { "should": [ 
         { "match": { "camp_id": "Elasticsearch" }}, 
         { "match": { "camp_id": "Solr" }} ] } 
      }, 
      "must": { 
       "bool" : { "should": [ 
         { "match": { "ad_id": "Elastic" }}, 
         { "match": { "ad_id": "dummy" }} ] } 
      }, 
      "must_not": { "match": {"authors": "radu gheorge" }}, 
      ..... 
      .....  
     } 
    } 
    } 

总之,(camp_id = 'elasticsearch' 或camp_id = '的solr')AND(ad_id = 'elasticsearch' 或ad_id =“Solr的”)......

好大量的研究之后,我写了下面的Java代码 -

final SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 

    final BoolQueryBuilder finalBoolQuery = new BoolQueryBuilder(); 

    BoolQueryBuilder campaignBoolQuery = null; 
    if (campaignIds != null) { 
     campaignBoolQuery = QueryBuilders.boolQuery(); 
     for (int campaignId : campaignIds) { 
      campaignBoolQuery.should(QueryBuilders.matchQuery("camp_id", campaignId)); 
     } 
    } 

    BoolQueryBuilder creativeBoolQuery = null; 
    if (creativeIds != null) { 
     creativeBoolQuery = QueryBuilders.boolQuery(); 
     for (int creativeId : creativeIds) { 
      creativeBoolQuery.should(QueryBuilders.matchQuery("ad_id", creativeId)); 
     } 
    } 

    finalBoolQuery.must(campaignBoolQuery); 
    finalBoolQuery.must(creativeBoolQuery); 
    searchSourceBuilder.query(finalBoolQuery).size(9999); 

    System.out.println(searchSourceBuilder.toString()); 

与上面的代码,我预计我会为“1项必备条款camp_id'和另外1个f或“ad_id”,但下面是我得到 -

{ 
    "size" : 9999, 
    "query" : { 
    "bool" : { 
     "must" : [ 
     { 
      "bool" : { 
      "should" : [ 
       { 
       "match" : { 
        "camp_id" : { 
        "query" : 1, 
        "operator" : "OR", 
        "prefix_length" : 0, 
        "max_expansions" : 50, 
        "fuzzy_transpositions" : true, 
        "lenient" : false, 
        "zero_terms_query" : "NONE", 
        "boost" : 1.0 
        } 
       } 
       }, 
       { 
       "match" : { 
        "camp_id" : { 
        "query" : 2, 
        "operator" : "OR", 
        "prefix_length" : 0, 
        "max_expansions" : 50, 
        "fuzzy_transpositions" : true, 
        "lenient" : false, 
        "zero_terms_query" : "NONE", 
        "boost" : 1.0 
        } 
       } 
       } 
      ], 
      "disable_coord" : false, 
      "adjust_pure_negative" : true, 
      "boost" : 1.0 
      } 
     }, 
     { 
      "bool" : { 
      "should" : [ 
       { 
       "match" : { 
        "ad_id" : { 
        "query" : 1, 
        "operator" : "OR", 
        "prefix_length" : 0, 
        "max_expansions" : 50, 
        "fuzzy_transpositions" : true, 
        "lenient" : false, 
        "zero_terms_query" : "NONE", 
        "boost" : 1.0 
        } 
       } 
       } 
      ], 
      "disable_coord" : false, 
      "adjust_pure_negative" : true, 
      "boost" : 1.0 
      } 
     } 
     ], 
     "disable_coord" : false, 
     "adjust_pure_negative" : true, 
     "boost" : 1.0 
    } 
    } 
} 

只有这两种包装和camp_id一个ad_id必须条款。有人能指出我错过了什么吗?我使用的弹性搜索版本 - 5.5.0和笑话 - 2.4.0我的Java客户端。

+0

我使用脑作为UI访问elasticsearch集群。当我试图从脑提供的其他客户端执行查询,我发现,它给了我一个错误,说明 - 复制必须条款。难道我们不能有多个必须条款吗?如果不是,应该是处理象SELECT * FROM运动的一种途径WHERE ID IN(1,2,3)和名称(“A”,“B”,“C”)。有人可以帮我吗? – user1305398

回答

0

boolbool示例查询包含两个must子句,但它们必须是单个must子句,它包含一个对象数组。我想你要覆盖与第二第一绝条款,呼吁must()时的两倍。

+0

不完全是,必备的作品为“和”,应为“或”,因此,对象: {“camp_id”:“Elasticsearch”,“ad_id”:“弹性”}将是一个有效的结果。 – Cleriston

相关问题