聯(lián)通營業(yè)廳做網(wǎng)站維護知乎營銷平臺
第6章 Elasticsearch,分布式搜索引擎【仿??途W(wǎng)社區(qū)論壇項目】
- 前言
- 推薦
- 項目總結(jié)
- 第6章 Elasticsearch,分布式搜索引擎
- 1.Elasticsearch入門
- 2.Spring整合Elasticsearch
- DiscussPostRepository
- DiscussPostController
- EventConsumer
- 3.開發(fā)社區(qū)搜索功能
- 最后
前言
2023-4-30 20:42:51
以下內(nèi)容源自【Java面試項目】
僅供學習交流使用
推薦
仿??途W(wǎng)項目【面試】
項目總結(jié)
第6章 Elasticsearch,分布式搜索引擎
1.Elasticsearch入門
2.Spring整合Elasticsearch
導入依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>
DiscussPostRepository
package com.jsss.community.dao.elasticsearch;import com.jsss.community.entity.DiscussPost;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;/*
ElasticsearchRepository<DiscussPost, Integer>
DiscussPost:接口要處理的實體類
Integer:實體類中的主鍵是什么類型
ElasticsearchRepository:父接口,其中已經(jīng)事先定義好了對es服務(wù)器訪問的增刪改查各種方法。Spring會給它自動做一個實現(xiàn),我們直接去調(diào)就可以了。*/
@Repository
public interface DiscussPostRepository extends ElasticsearchRepository<DiscussPost, Integer> {}
DiscussPostController
發(fā)帖|刪帖的時候,放到kakfa中了
@RequestMapping(path = "/add",method = RequestMethod.POST)@ResponseBodypublic String addDiscussPost(String title,String content){User user=hostHolder.getUser();if (user==null){return CommunityUtil.getJSONString(403,"你還沒有登錄");}DiscussPost post=new DiscussPost();post.setUserId(user.getId());post.setTitle(title);post.setContent(content);post.setCreateTime(new Date());discussPostService.addDiscussPost(post);//觸發(fā)發(fā)帖實踐Event event =new Event().setTopic(TOPIC_PUBLISH).setUserId(user.getId()).setEntityType(ENTITY_TYPE_POST).setEntityId(post.getId());eventProducer.fireEvent(event);String redisKey= RedisKeyUtil.getPostScoreKey();redisTemplate.opsForSet().add(redisKey,post.getId());//報錯的情況,將來統(tǒng)一處理return CommunityUtil.getJSONString(0,"發(fā)布成功!");}// 刪除@RequestMapping(path = "/delete", method = RequestMethod.POST)@ResponseBodypublic String setDelete(int id) {discussPostService.updateStatus(id, 2);// 觸發(fā)刪帖事件Event event = new Event().setTopic(TOPIC_DELETE).setUserId(hostHolder.getUser().getId()).setEntityType(ENTITY_TYPE_POST).setEntityId(id);eventProducer.fireEvent(event);return CommunityUtil.getJSONString(0);}
EventConsumer
// 消費發(fā)帖事件@KafkaListener(topics = {TOPIC_PUBLISH})public void handlePublishMessage(ConsumerRecord record) {if (record == null || record.value() == null) {logger.error("消息的內(nèi)容為空!");return;}Event event = JSONObject.parseObject(record.value().toString(), Event.class);if (event == null) {logger.error("消息格式錯誤!");return;}DiscussPost post = discussPostService.findDiscussPostById(event.getEntityId());elasticsearchService.saveDiscussPost(post);}// 消費刪帖事件@KafkaListener(topics = {TOPIC_DELETE})public void handleDeleteMessage(ConsumerRecord record) {if (record == null || record.value() == null) {logger.error("消息的內(nèi)容為空!");return;}Event event = JSONObject.parseObject(record.value().toString(), Event.class);if (event == null) {logger.error("消息格式錯誤!");return;}elasticsearchService.deleteDiscussPost(event.getEntityId());}
3.開發(fā)社區(qū)搜索功能
ElasticsearchService
public List<DiscussPost> searchDiscussPost(String keyword, int current, int limit) throws IOException {SearchRequest searchRequest = new SearchRequest("discusspost");//discusspost是索引名,就是表名NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();//高亮HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.field("title");highlightBuilder.field("content");highlightBuilder.requireFieldMatch(false);highlightBuilder.preTags("<em>");highlightBuilder.postTags("</em>");//構(gòu)建搜索條件SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().query(QueryBuilders.multiMatchQuery(keyword, "title", "content")).sort(SortBuilders.fieldSort("type").order(SortOrder.DESC)).sort(SortBuilders.fieldSort("score").order(SortOrder.DESC)).sort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC)).from(current)// 指定從哪條開始查詢.size(limit)// 需要查出的總記錄條數(shù).highlighter(highlightBuilder);//高亮searchRequest.source(searchSourceBuilder);//這有個異常SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);List<DiscussPost> list = new LinkedList<>();for (SearchHit hit : searchResponse.getHits().getHits()) {DiscussPost discussPost = JSONObject.parseObject(hit.getSourceAsString(), DiscussPost.class);// 處理高亮顯示的結(jié)果HighlightField titleField = hit.getHighlightFields().get("title");if (titleField != null) {discussPost.setTitle(titleField.getFragments()[0].toString());}HighlightField contentField = hit.getHighlightFields().get("content");if (contentField != null) {discussPost.setContent(contentField.getFragments()[0].toString());}
// System.out.println(discussPost);list.add(discussPost);}return list;}
最后
2023-7-31 20:34:10
這篇博客能寫好的原因是:站在巨人的肩膀上
這篇博客要寫好的目的是:做別人的肩膀
開源:為愛發(fā)電
學習:為我而行