Elasticsearch:高亮处理

向右看齐 2024-03-24 10:49 126阅读 0赞
  1. import org.apache.http.HttpHost;
  2. import org.elasticsearch.client.RestClient;
  3. import org.elasticsearch.client.RestHighLevelClient;
  4. @Configuration
  5. public class ElasticsearchConfig {
  6. @Bean
  7. public RestHighLevelClient restHighLevelClient(){
  8. return new RestHighLevelClient(RestClient.builder(
  9. HttpHost.create("http://192.168.150.101:9200")
  10. ));
  11. }
  12. }
  13. @Data
  14. public class Demo{
  15. // 高亮处理name
  16. private String name;
  17. }
  18. import com.alibaba.fastjson.JSON;
  19. import lombok.extern.slf4j.Slf4j;
  20. import org.apache.commons.lang3.StringUtils;
  21. import org.elasticsearch.action.search.SearchRequest;
  22. import org.elasticsearch.action.search.SearchResponse;
  23. import org.elasticsearch.client.RestHighLevelClient;
  24. import org.elasticsearch.index.query.QueryBuilders;
  25. import org.elasticsearch.search.SearchHit;
  26. import org.elasticsearch.search.SearchHits;
  27. @Slf4j
  28. @Service
  29. public class DemoService extends ServiceImpl<DemoMapper, Demo> implements IDemoService {
  30. @Autowired
  31. private RestHighLevelClient restHighLevelClient;
  32. @Override
  33. public PageResult search(RequestParams params) {
  34. try {
  35. // 1.准备Request
  36. SearchRequest request = new SearchRequest("demo");
  37. // 2.准备请求参数
  38. // 2.1.query
  39. String key = params.getKey();
  40. if (StringUtils.isNotBlank(key)) {
  41. // 不为空,根据关键字查询
  42. request.source().query(QueryBuilders.matchQuery("all", key));
  43. } else {
  44. // 为空,查询所有
  45. request.source().query(QueryBuilders.matchAllQuery());
  46. }
  47. // 2.2.分页
  48. int page = params.getPage();
  49. int size = params.getSize();
  50. request.source().from((page - 1) * size).size(size);
  51. // 3.发送请求
  52. SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  53. // 4.解析响应
  54. return handleResponse(response);
  55. } catch (IOException e) {
  56. throw new RuntimeException("搜索数据失败", e);
  57. }
  58. }
  59. private PageResult handleResponse(SearchResponse response) {
  60. SearchHits searchHits = response.getHits();
  61. // 4.1.总条数
  62. long total = searchHits.getTotalHits().value;
  63. // 4.2.获取文档数组
  64. SearchHit[] hits = searchHits.getHits();
  65. // 4.3.遍历
  66. List<Demo> demoList = new ArrayList<>(hits.length);
  67. for (SearchHit hit : hits) {
  68. // 4.4.获取source
  69. String json = hit.getSourceAsString();
  70. // 4.5.反序列化,非高亮的
  71. Demo demo= JSON.parseObject(json, Demo.class);
  72. // ========================================================================================
  73. // 4.6.处理高亮结果
  74. // 1)获取高亮map
  75. Map<String, HighlightField> map = hit.getHighlightFields();
  76. if (map != null && !map.isEmpty()) {
  77. // 2)根据字段名,获取高亮结果
  78. HighlightField highlightField = map.get("name");
  79. if (highlightField != null) {
  80. // 3)获取高亮结果字符串数组中的第1个元素
  81. String hName = highlightField.getFragments()[0].toString();
  82. // 4)把高亮结果放到HotelDoc中
  83. hotelDoc.setName(hName);
  84. }
  85. }
  86. // ========================================================================================
  87. // 4.7.放入集合
  88. demoList.add(demo);
  89. }
  90. return new PageResult(total, hotels);
  91. }
  92. }

发表评论

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

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

相关阅读