根据关键字查询
(1) changgou_service_search项目创建SearchService接口
public interface SearchService { /** * 全文检索 * @param paramMap 查询参数 * @return */ public Map search(Map<String, String> paramMap) throws Exception; }
(2) changgou_service_search项目创建SearchService接口实现类SearchServiceImpl
@Service public class SearchServiceImpl implements SearchService { @Autowired private ElasticsearchTemplate esTemplate; //设置每页查询条数据 public final static Integer PAGE_SIZE = 20; @Override public Map search(Map<String, String> searchMap) throws Exception { Map<String, Object> resultMap = new HashMap<>(); //有条件才查询Es if (null != searchMap) { //组合条件对象 BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); //0:关键词 if (!StringUtils.isEmpty(searchMap.get("keywords"))) { boolQuery.must(QueryBuilders.matchQuery("name", searchMap.get("keywords")).operator(Operator.AND)); } //4. 原生搜索实现类 NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder(); nativeSearchQueryBuilder.withQuery(boolQuery); //10: 执行查询, 返回结果对象 AggregatedPage<SkuInfo> aggregatedPage = esTemplate.queryForPage(nativeSearchQueryBuilder.build(), SkuInfo.class, new SearchResultMapper() { @Override public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) { List<T> list = new ArrayList<>(); SearchHits hits = searchResponse.getHits(); if (null != hits) { for (SearchHit hit : hits) { SkuInfo skuInfo = JSON.parseObject(hit.getSourceAsString(), SkuInfo.class); list.add((T) skuInfo); } } return new AggregatedPageImpl<T>(list, pageable, hits.getTotalHits(), searchResponse.getAggregations()); } }); //11. 总条数 resultMap.put("total", aggregatedPage.getTotalElements()); //12. 总页数 resultMap.put("totalPages", aggregatedPage.getTotalPages()); //13. 查询结果集合 resultMap.put("rows", aggregatedPage.getContent()); return resultMap; } return null; } }
(3) changgou_service_search项目创建SearchController
@RestController @RequestMapping("/sku_search") public class SearchController { @Autowired private EsManagerService esManagerService; @Autowired private SearchService searchService; //对搜索入参带有特殊符号进行处理 public void handlerSearchMap(Map<String,String> searchMap){ if(null != searchMap){ Set<Map.Entry<String, String>> entries = searchMap.entrySet(); for (Map.Entry<String, String> entry : entries) { if(entry.getKey().startsWith("spec_")){ searchMap.put(entry.getKey(),entry.getValue().replace("+","%2B")); } } } } /** * 全文检索 * @return */ @GetMapping public Map search(@RequestParam Map<String, String> paramMap) throws Exception { //特殊符号处理 handlerSearchMap(searchMap); Map resultMap = searchService.search(paramMap); return resultMap; } }
(4) 测试
使用postmain访问 http://localhost:9009/sku_search?keywords=手机
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)