我是elasticsearch的新手。我有一个过滤的查询,使用控制台给我正确的结果:
GET _search
{
"query": {
"filtered": {
"query": {
"bool" : {
"should" : [
{
"match" : { "name" : "necklace" }
},
{
"match" : { "skuCode" : "necklace" }
}
]
}
},
"filter": {
"bool" : {
"must" : [
{
"term" : { "enabled" : true }
},
{
"term" : { "type" : "SIMPLE" }
},
{
"term" : { "tenantCode" : "Triveni" }
}
]
}
}
}
}
}
我无法获得相应的spring-data版本。这是我试过的:
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQuery().should(matchQuery("skuCode", keyword)).should(matchQuery("name", keyword))).withFilter(
boolFilter().must(termFilter("enabled", true), termFilter("type", "SIMPLE"), termFilter("tenantCode", "Triveni"))).build();
此查询没有给我任何结果。
有人可以帮帮我吗?
答案 0 :(得分:3)
NativeSearchQueryBuilder.withFilter转换为所谓的 post_filter 。有关详细信息,请参阅Post Filter。因此,您在控制台上执行的查询与spring-data elasticsearch生成的查询不同。要从控制台模仿查询,您必须使用 FilteredQuery 。
将您的查询构建更改为:
QueryBuilder boolQueryBuilder = boolQuery().should(matchQuery("skuCode", keyword)).should(matchQuery("name", keyword));
FilterBuilder filterBuilder = boolFilter().must(termFilter("enabled", true), termFilter("type", "SIMPLE"), termFilter("tenantCode", "Triveni"));
NativeSearchQueryBuilder().withQuery(QueryBuilders.filteredQuery(boolQueryBuilder, filterBuilder).build();
虽然只要不使用聚合,但这不应影响(命中)结果。