【问题标题】:How to search by nested field id using NativeSearchQueryBuilder in ElasticsearchRepository?如何使用 ElasticsearchRepository 中的 NativeSearchQueryBuilder 按嵌套字段 id 进行搜索?
【发布时间】: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


    【解决方案1】:

    您的顶级查询应该是一个 bool 查询,其中包含两个条目作为必须

    • name 的第一个将是您已有的。
    • “status.id”属性的第二个

    【讨论】:

    • 非常感谢您的回答。同时也感谢您抽出宝贵时间回答这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2021-01-24
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多