使用 java 客户端的条件查询弹性搜索不工作
conditional Query elastic search using java client not working
我正在尝试使用弹性搜索 API 编写提取查询和删除文档,它应该满足以下两个条件
- 如果 accountType 不是“预付”或
- 如果 accountType 不是“后付费”并且 ProductName 不是“SIM”并且
- 时间戳少于 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的条件。
我正在尝试使用弹性搜索 API 编写提取查询和删除文档,它应该满足以下两个条件
- 如果 accountType 不是“预付”或
- 如果 accountType 不是“后付费”并且 ProductName 不是“SIM”并且
- 时间戳少于 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的条件。