You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android(Java)如何用@searchable搜索AWS Amplify DataStore数据

Android端Java实现Amplify搜索查询的可用方法

可用核心方法

  • Amplify.API.query():Amplify提供的通用GraphQL查询入口,所有搜索请求最终都通过该方法发起,支持传入预生成的模型搜索请求、自定义GraphQL请求两种模式。
  • 模型预生成搜索构造器:给GraphQL Schema中的类型添加@searchable注解后,执行代码生成命令会自动为对应模型生成[模型名].SEARCH_MODELS请求构造器,支持链式配置过滤条件、排序规则、分页参数,无需手写GraphQL语句。
  • 自定义请求构造方法:当需要使用全文检索高级语法、聚合统计等预生成构造器不支持的能力时,可通过SimpleGraphQLRequest类自行拼接查询文档、传入变量,实现自定义搜索逻辑。

基础实现示例(使用预生成构造器)

以带@searchable注解的Post模型为例,实现标题包含指定关键词、按发布时间倒序的分页搜索:

// 构造过滤条件:标题包含"Android",且发布时间在近30天内
QueryPredicate searchFilter = Post.TITLE.contains("Android")
        .and(Post.CREATED_AT.gt(Instant.now().minus(30, ChronoUnit.DAYS).getEpochSecond()));

// 链式构造搜索请求
GraphQLRequest<PaginatedResult<Post>> searchRequest = Post.SEARCH_MODELS.builder()
        .filter(searchFilter)
        .sort(Post.CREATED_AT.descending())
        .limit(20) // 单页最多返回20条结果
        .build();

// 发起搜索请求
Amplify.API.query(
        searchRequest,
        response -> {
            PaginatedResult<Post> resultPage = response.getData();
            // 遍历当前页结果
            for (Post item : resultPage) {
                Log.d("SearchResult", "匹配到文章:" + item.getTitle());
            }
            // 存在下一页时可调用resultPage.getNextPage()继续拉取
        },
        error -> Log.e("SearchError", "搜索请求失败", error)
);

自定义高级搜索实现示例

如果需要使用OpenSearch支持的match短语匹配、聚合等高级能力,可通过自定义GraphQL语句实现:

// 自定义搜索查询文档,使用matchPhrase做全文短语匹配
String searchDoc = "query CustomPostSearch($filter: SearchablePostFilterInput) {\n" +
        "  searchPosts(filter: $filter) {\n" +
        "    items { id title content }\n" +
        "    total\n" +
        "  }\n" +
        "}";

// 构造查询变量
Map<String, Object> filterMap = new HashMap<>();
Map<String, Object> titleMatch = new HashMap<>();
titleMatch.put("matchPhrase", "Amplify 接入教程");
filterMap.put("title", titleMatch);
Map<String, Object> variables = Collections.singletonMap("filter", filterMap);

// 构造自定义请求,指定响应类和序列化器
GraphQLRequest<CustomSearchResponse> customRequest = new SimpleGraphQLRequest<>(
        searchDoc,
        variables,
        CustomSearchResponse.class,
        new GsonVariablesSerializer()
);

// 发起自定义搜索
Amplify.API.query(
        customRequest,
        resp -> Log.d("CustomSearch", "匹配结果总数:" + resp.getData().getTotal()),
        err -> Log.e("CustomSearchErr", "自定义搜索失败", err)
);

注意:使用前请确保已经完成云端资源部署,且在Android项目目录下执行过代码生成命令同步最新模型,否则不会生成对应模型的SEARCH_MODELS构造器。预生成的链式构造器仅支持基础的精确匹配、范围匹配、排序分页能力,高级搜索语法必须通过自定义请求实现。

内容的提问来源于stack exchange,提问作者ThinQ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:51:22