使用 java 客户端的条件查询弹性搜索不工作

conditional Query elastic search using java client not working

我正在尝试使用弹性搜索 API 编写提取查询和删除文档,它应该满足以下两个条件

  1. 如果 accountType 不是“预付”或
  2. 如果 accountType 不是“后付费”并且 ProductName 不是“SIM”并且
  3. 时间戳少于 30 天

我已经尝试使用下面的代码,但它没有获取正确的文档。目的是获取所有这些文档并从弹性搜索索引中删除

QueryBuilder query = QueryBuilders.boolQuery()
                .should(QueryBuilders.boolQuery().mustNot(QueryBuilders.matchQuery("ACCOUNT_TYPE", "PREPAID")))
                .should(QueryBuilders.boolQuery().mustNot(QueryBuilders.matchPhraseQuery("ACCOUNT_TYPE","POSTPAID"))
                .mustNot(QueryBuilders.matchPhraseQuery("PRODUCT_NAME", "SIM"))).minimumShouldMatch(1)
                .must(QueryBuilders.rangeQuery(LASTUPDATED_TIMESTAMP_PARAM).lt(interval.getDelDateString()));

方法 2:我也曾尝试 运行 在 Kibana 开发工具中生成上述查询,但仍然没有给出正确的结果。

请告诉我上面的代码哪里出了问题,以满足获取数据的条件。

形成的查询如下所示post @Val resposne

{"bool":{"filter":[{"range":{"lastupdatedTimestamp":{"from":null,"to":"2022-03-12T22:00:00"," include_lower":true,"include_upper":false,"boost":1}}}],"should":[{"bool":{"must_not":[{ "match":{"ACCOUNT_TYPE":{"query":"PREPAID","operator":"OR","prefix_length":0,"max_expansions":50, "fuzzy_transpositions":true,"lenient":false,"zero_terms_query":"NONE","auto_generate_synonyms_phrase_query":true,"boost":1}}} ],"adjust_pure_negative":true,"boost":1}},{"bool":{"must_not":[{"匹配":{"ACCOUNT_TYPE":{ "query":"POSTPAID","operator":"OR","prefix_length":0,"max_expansions":50,"fuzzy_transpositions":true,"lenient": false,"zero_terms_query":"NONE","auto_generate_synonyms_phrase_query":true,"boost":1}}},{"match":{"PRODUCT_NAME" :{"query":"SIM","operator":"OR","prefix_length":0,"max_expansions":50,"fuzzy_transpositions":true,"lenient ":false,""zero_terms_query":"NONE","auto_generate_synonyms_phrase_query":true,"boost":1}}}],"adjust_pure_negative":true, "boost":1}}],"adjust_pure_negative":true,"minimum_should_match":"1","boost":1}}

您有一些布尔逻辑问题。试试这个方法:

QueryBuilder query = QueryBuilders.boolQuery()
         .filter(QueryBuilders.rangeQuery(LASTUPDATED_TIMESTAMP_PARAM).lt(interval.getDelDateString()))             
         .minimumShouldMatch(1)
         .should(QueryBuilders.boolQuery().mustNot(QueryBuilders.matchQuery("ACCOUNT_TYPE", "PREPAID")))
         .should(QueryBuilders.boolQuery()    
                    .mustNot(QueryBuilders.matchQuery("ACCOUNT_TYPE","POSTPAID"))
                    .mustNot(QueryBuilders.matchQuery("PRODUCT_NAME", "SIM")));

这里是弹性搜索 java api 调用以有条件地获取记录并稍后删除它

QueryBuilder query = QueryBuilders.boolQuery()
         .filter(QueryBuilders.rangeQuery(LASTUPDATED_TIMESTAMP_PARAM).lt(interval.getDelDateString()))     
         .filter(QueryBuilders.boolQuery().mustNot(QueryBuilders.matchQuery(ACCOUNT_TYPE, "PREPAID")))
         .must(QueryBuilders.boolQuery()
                       .should(QueryBuilders.boolQuery().mustNot(QueryBuilders.matchQuery(ACCOUNT_TYPE,"POSTPAID")))
                       .should(QueryBuilders.boolQuery().mustNot(QueryBuilders.matchQuery(PRODUCT_NAME, "SIM"))).minimumShouldMatch(1));
            

这满足了获取所有非PREPAID订单和非POSPAID产品名称不是SIM的条件。