如何在 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”属性
我正在使用 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”属性