Java的新项目学成在线笔记-day11(九)

.4.3 分页与高亮

[AppleScript] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

@Service public class EsCourseService {  

  private static final Logger LOGGER = LoggerFactory.getLogger(EsCourseService.class);  

    @Value("${xuecheng.elasticsearch.course.index}")

    private String es_index;  

  @Value("${xuecheng.elasticsearch.course.type}") 

   private String es_type;  

  @Value("${xuecheng.elasticsearch.course.source_field}")  

  private String source_field;   

   @Autowired  

  RestHighLevelClient restHighLevelClient;   

   public QueryResponseResult<CoursePub> list(int page,int size,CourseSearchParam  courseSearchParam)  {    

      //设置索引        

SearchRequest searchRequest = new SearchRequest(es_index);  

      //设置类型    

    searchRequest.types(es_type);     

   SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();    

    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();    

    //source源字段过虑     

   String[] source_fields = source_field.split(",");     

   searchSourceBuilder.fetchSource(source_fields, new String[]{});   

     //关键字      

  if(StringUtils.isNotEmpty(courseSearchParam.getKeyword())){    

        //匹配关键字       

     MultiMatchQueryBuilder multiMatchQueryBuilder =  QueryBuilders.multiMatchQuery(courseSearchParam.getKeyword(), "name",  "teachplan","description");             //设置匹配占比      

      multiMatchQueryBuilder.minimumShouldMatch("70%");      

      //提升另个字段的Boost值     

       multiMatchQueryBuilder.field("name",10);      

      boolQueryBuilder.must(multiMatchQueryBuilder);   

     }   

     //过虑    

    if(StringUtils.isNotEmpty(courseSearchParam.getMt())){     

       boolQueryBuilder.filter(QueryBuilders.termQuery("mt",courseSearchParam.getMt()));    

    }     

   if(StringUtils.isNotEmpty(courseSearchParam.getSt())){

 

[AppleScript] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

boolQueryBuilder.filter(QueryBuilders.termQuery("st",courseSearchParam.getSt()));         }         if(StringUtils.isNotEmpty(courseSearchParam.getGrade())){              boolQueryBuilder.filter(QueryBuilders.termQuery("grade",courseSearchParam.getGrade()));  

      }     

   //分页   

     if(page<=0){    

        page = 1;     

   }     

   if(size<=0){    

        size = 20

       }     

   int start = (page‐1)*size;  

      searchSourceBuilder.from(start)

       searchSourceBuilder.size(size);    

    //布尔查询   

     searchSourceBuilder.query(boolQueryBuilder);      

  //高亮设置      

  HighlightBuilder highlightBuilder = new HighlightBuilder();  

      highlightBuilder.preTags("<font class='eslight'>");   

     highlightBuilder.postTags("</font>");     

   //设置高亮字段   

     highlightBuilder.fields().add(new HighlightBuilder.Field("name"));  

      searchSourceBuilder.highlighter(highlightBuilder);   

     //请求搜索        

searchRequest.source(searchSourceBuilder)

       SearchResponse searchResponse = null;  

      try {       

     searchResponse = restHighLevelClient.search(searchRequest)

       } catch (IOException e) {       

     e.printStackTrace();      

      LOGGER.error("xuecheng search error..{}",e.getMessage());      

      return new QueryResponseResult(CommonCode.SUCCESS,new QueryResult<CoursePub>());  

      }       

   //结果集处理   

     SearchHits hits = searchResponse.getHits();     

   SearchHit[] searchHits = hits.getHits();  

      //记录总数   

     long totalHits = hits.getTotalHits();   

     //数据列表    

    List<CoursePub> list = new ArrayList<>();  

        for (SearchHit hit : searchHits) {    

        CoursePub coursePub = new CoursePub();      

        //取出source       

     Map<String, Object> sourceAsMap = hit.getSourceAsMap();      

        //取出名称       

     String name = (String) sourceAsMap.get("name");

            //取出高亮字段内容

 

[AppleScript] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

Map<String, HighlightField> highlightFields = hit.getHighlightFields();    

       if(highlightFields!=null){       

        HighlightField nameField = highlightFields.get("name");    

           if(nameField!=null){               

    Text[] fragments = nameField.getFragments();       

            StringBuffer stringBuffer = new StringBuffer();           

        for (Text str : fragments) {     

                  stringBuffer.append(str.string());        

           }              

     name = stringBuffer.toString();         

        }        

   }      

     coursePub.setName(name);   

        //图片      

     String pic = (String) sourceAsMap.get("pic");   

        coursePub.setPic(pic);    

       //价格        

   Float price = null;      

     try {        

       if(sourceAsMap.get("price")!=null ){     

              price = Float.parseFloat((String) sourceAsMap.get("price"));      

         }         

    } catch (Exception e) {      

         e.printStackTrace();      

     }        

   coursePub.setPrice(price);  

         Float price_old = null;     

      try {       

        if(sourceAsMap.get("price_old")!=null ){       

            price_old = Float.parseFloat((String) sourceAsMap.get("price_old"));       

        }        

   } catch (Exception e) {          

     e.printStackTrace();    

       }        

   coursePub.setPrice_old(price_old);  

           list.add(coursePub);     

    }     

  QueryResult<CoursePub> queryResult = new QueryResult<>();   

    queryResult.setList(list);  

     queryResult.setTotal(totalHits);   

    QueryResponseResult<CoursePub> coursePubQueryResponseResult = new

QueryResponseResult<CoursePub>(CommonCode.SUCCESS,queryResult);     

  return coursePubQueryResponseResult;  

 }   }


4.5 Controller 

[AppleScript] 纯文本查看 复制代码

?

1

2

3

4

5

6

7

@RestController @RequestMapping("/search/course") public class EsCourseController implements EsCourseControllerApi {     @Autowired 

   EsCourseService esCourseService;   

      @Override  

  @GetMapping(value="/list/{page}/{size}") 

   public QueryResponseResult<CoursePub> list(@PathVariable("page") int page,  @PathVariable("size") int size, CourseSearchParam courseSearchParam) throws IOException {       

 return esCourseService.list(page,size,courseSearchParam)

   } }


4.5 测试 
使用postman测试/search/course

Java的新项目学成在线笔记-day11(九)