实现功能
1 自定义搜索字段 2 高亮显示 3 支持分页
整合ES (v7.6)
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
代码
1 实体类 分类id我使用了keyword 分类需要准确 内容我注了,感觉没必要放入es
2 Repository 使用Repository方便增 和 删 (没有改的操作 查用不到)
本文只讲搜索 不讲Repository
搜索 ***(重点)
/**
* 基础搜索
* <p>
* 搜索结果高亮
* <p>
* 结果支持分页
*/
public ResponseResult baseSearch(String keyword, int pageNo, int pageSize, String... fieldNames) {
pageNo = this.checkPage(pageNo) - 1; // 默认是1,但是es中默认是0
pageSize = this.checkSize(pageSize);
// 在标题,标签
QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(keyword, fieldNames);
Query query = new NativeSearchQuery(queryBuilder);
//设置分页
query.setPageable(PageRequest.of(pageNo, pageSize));
// 设置高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
// 设置高亮字段 (个人感觉这里不灵活,highlightBuilder的高亮字段只能一个一个的添加)
Arrays.stream(fieldNames).forEach(highlightBuilder::field);
highlightBuilder.preTags("<span style='color:red'>");
highlightBuilder.postTags("</span>");
HighlightQuery highlightQuery = new HighlightQuery(highlightBuilder);
query.setHighlightQuery(highlightQuery);
// 搜索
SearchHits<Article> search = esRestTemplate.search(query, Article.class);
// 搜索结果处理
List<SearchHit<Article>> lists = search.getSearchHits();
List<Article> articles = new ArrayList<>();
for (SearchHit<Article> list : lists) {
Article article = list.getContent();
// 高亮替换 就是将原来的字段替换为高亮的字段
Map<String, List<String>> highlightFields = list.getHighlightFields();
Arrays.stream(fieldNames).forEach(fieldName -> setFieldValue(article, fieldName, highlightFields.get(fieldName).get(0)));
articles.add(article);
}
return ResponseResult.SUCCESS("获取成功").setData(articles);
}
写一个基础的搜索功能 参数为搜索关键词 分页数据 和需要查找的字段(默认查找的字段都高亮显示了 ...就该如此...我觉得) 正好 multiMatchQuery(keyword, fieldNames)中的fieldNames是可变字段,直接 奈斯
可是 highlightBuilder.field只支持一个一个的添加 吐槽
需要自定义高亮标签
highlightBuilder.preTags("<span style='color:red'>");
highlightBuilder.postTags("</span>");
到此为止就可以直接搜索了
可是 搜索的结果是 Article 放在 content 里面 高亮结果在别处 HighlightFields中 此时需要将高亮结果替换Article 中不高亮的 此处利用 反射
(反射有时还是很好用的) 将字段值设置
使用
基础的搜索功能实现后,使用时就很简单了 需要的地方传个参数就行了
例如:
1 搜索服务 搜索 标题, 标签, 摘要
/**
* 搜索服务
* <p>
* 默认 搜索 标题, 标签, 摘要
*/
@Override
public ResponseResult search(String keyword, int pageNo, int pageSize) {
return baseSearch(keyword, pageNo, pageSize, "title", "summary", "labels");
}
2 分类搜素 搜索 分类id
/**
* 分类搜素
* <p>
* 分类搜索需要传的是分类id
* 且分类id作为keyword类型搜索
*/
@Override
public ResponseResult categorySearch(String keyword, int pageNo, int pageSize) {
return baseSearch(keyword, pageNo, pageSize, "categoryId");
}
3 标签搜索 搜索 标签
/**
* 标签搜索
* <p>
* 通过点击标签云或者点击文章下面的标签进行的搜索
*/
@Override
public ResponseResult labelSearch(String keyword, int pageNo, int pageSize) {
return baseSearch(keyword, pageNo, pageSize, "labels");
}
怎么样 是不是感觉很好用的样子有木有
效果
测试 标签搜索
基本搜索
好了,文章到这就结束了 不见