elasticsearch 分页+高亮处理

梦里梦外; 2023-10-03 14:34 77阅读 0赞

既然你点到这里了,那你也有一定es的基础了,关于es的配置和依赖我也不多说了,直接上代码

controller层

  1. @GetMapping("eskeyword")
  2. public R mohu(@RequestParam(value = "ename",defaultValue = "")String ename
  3. ,@RequestParam(value = "page",defaultValue = "1")int page
  4. ,@RequestParam(value = "size",defaultValue = "3")int size) throws IOException {
  5. //这个pageutils是我自动生成的你们另选其他
  6. PageUtils mohues = stuService.mohues(ename, page, size);
  7. return R.ok().put("page",mohues);
  8. }

serviceimp

  1. @Override
  2. public PageUtils mohues(String ename, int page, int size) throws IOException {
  3. SearchRequest searchRequest = new SearchRequest("week2");
  4. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  5. System.out.println(ename);
  6. //判断是否存在
  7. if (ename.equals("")){
  8. //不存在查全部
  9. searchSourceBuilder.query(QueryBuilders.matchAllQuery());
  10. }else {
  11. //存在查条件 //多条件用,分隔
  12. MultiMatchQueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(ename, "ename", "sex");
  13. searchSourceBuilder.query(queryBuilder);
  14. }
  15. //分页
  16. searchSourceBuilder.from((page-1)*size);
  17. searchSourceBuilder.size(size);
  18. //高亮
  19. if (!ename.equals("")){
  20. HighlightBuilder highlightBuilder = new HighlightBuilder();
  21. highlightBuilder.field("ename").field("sex");
  22. highlightBuilder.preTags("<span style='color:red'>");
  23. highlightBuilder.postTags("</span>");
  24. searchSourceBuilder.highlighter(highlightBuilder);
  25. }
  26. //sex
  27. searchRequest.source(searchSourceBuilder);
  28. //执行
  29. SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
  30. //处理结果
  31. SearchHits hits = search.getHits();
  32. TotalHits totalHits = hits.getTotalHits();
  33. //所有数量
  34. long aa= totalHits.value;
  35. SearchHit[] hits1 = hits.getHits();
  36. ArrayList<StuEntity> arr = new ArrayList<>();
  37. for (SearchHit hit : hits1) {
  38. String index = hit.getIndex();
  39. String id = hit.getId();
  40. float score = hit.getScore();
  41. //拿到json字符串
  42. String string = hit.getSourceAsString();
  43. //json转对象
  44. StuEntity stuEntity = JSON.parseObject(string, StuEntity.class);
  45. stuEntity.setEid(Integer.valueOf(id));
  46. if(ename.equals("")){
  47. }else {
  48. //处理高亮====================================
  49. Map<String, HighlightField> highlightFields = hit.getHighlightFields();
  50. //获取ename的值
  51. HighlightField highlight = highlightFields.get("ename");
  52. if (highlight!=null){
  53. //官方粘的,别问我什么意思
  54. Text[] fragments = highlight.fragments();
  55. String fragmentString = fragments[0].string();
  56. stuEntity.setEname(fragmentString);
  57. }
  58. HighlightField sexhighlight = highlightFields.get("sex");
  59. if (sexhighlight!=null){
  60. //和上同理sexhighlight是上面返回的值
  61. Text[] fragments = sexhighlight.fragments();
  62. String fragmentString = fragments[0].string();
  63. stuEntity.setSex(fragmentString);
  64. }
  65. }
  66. arr.add(stuEntity);
  67. }
  68. //分页
  69. PageUtils stuEntityPageUtil = new PageUtils(arr, Math.toIntExact(aa),size,page);
  70. return stuEntityPageUtil;
  71. }

外加SQL写法

  1. GET week2/_search
  2. {
  3. "query": {
  4. "multi_match": {
  5. "query": "张",
  6. "fields": ["ename","sex"]
  7. }
  8. },
  9. "highlight": {
  10. "fields": {
  11. "ename":{
  12. }},
  13. "pre_tags": "<span style='color:red'>",
  14. "post_tags": "</span>"
  15. }
  16. }

另外小提示
前台es想要 高亮必须加
在这里插入图片描述

想要详细查看官网
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.x/java-rest-high-search.html

发表评论

表情:
评论列表 (有 0 条评论,77人围观)

还没有评论,来说两句吧...

相关阅读