使用Spring Data Elasticsearch中的NativeSearchQueryBuilder进行过滤查询

7

我是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();

这个查询没有返回任何结果。

有人能帮帮我吗?

1个回答

6

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();

尽管只要不使用聚合,这不应该影响(命中)结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接