【发布时间】:2021-10-29 13:13:44
【问题描述】:
我正在使用spring-data-elasticsearch,我有一个类如下,
@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,但它只适用于没有空格的单词。如果有带空格的单词,则抛出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));
【问题讨论】:
标签: java spring-boot elasticsearch spring-data-elasticsearch