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
相关产品推荐
相关产品推荐

