如何在 ElasticsearchRepository 中使用 NativeSearchQueryBuilder 按嵌套字段 ID 进行搜索?

How to search by nested field id using NativeSearchQueryBuilder in ElasticsearchRepository?

我正在使用 spring-data-elasticsearch 并且我有一个 class 如下,

@Document(indexName = "sample")
class Sample {

   @Id
   private String id;
   private String name;
   private Status status;
}

class Status {
   private String id;
}

以上内容持续到 elasticsearch。我有以下方法可以在其中查找数据。

List<Sample> getAll(String statusId, String text, Pageable pageable);

这是我用来获取数据的当前代码,

NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.multiMatchQuery(text)
                        .field("name")
                        .type(MultiMatchQueryBuilder.Type.PHRASE_PREFIX));
NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();

我需要的是我需要通过 statusId 查找结果,然后搜索 name 字段中包含的文本。

下面的方法我也试过了,还是不行。我也尝试了 criteria-api,但它只适用于没有 space 的单词。如果有带有 space 的单词,它会抛出 Cannot constructQuery '*\"text\"*'. Use expression or multiple clauses instead

.withFilter(QueryBuilders.termQuery("status.id", statusId))

那么如何为上述场景构建查询?

根据 P.J. Meisch

的建议构建新查询
QueryBuilder query1 = QueryBuilders.matchQuery("status.id", statusId).operator(Operator.AND);
QueryBuilder query2 = QueryBuilders.multiMatchQuery(text).field("name").type(MultiMatchQueryBuilder.Type.PHRASE_PREFIX);

new NativeSearchQueryBuilder().withQuery(QueryBuilders.boolQuery().must(query1).must(query2));

您的顶级查询应该是一个 bool 查询,其中包含两个条目 must:

  • name 的第一个,这将是您已经拥有的那个。
  • 第二个为“status.id”属性