黑马头条-day10

这篇具有很好参考价值的文章主要介绍了黑马头条-day10。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


app端文章搜索

1、文章搜索

1.1 ElasticSearch环境搭建

1、启动ElasticSearch

docker start elasticsearch

2、启动Kibana

docker start kibana

3、kibana测试分词效果

1.2 索引库创建

①需求分析

黑马头条-day10,黑马头条,jenkins,运维

  • 用户输入关键词 比如java只要文章titile、content包含此关键词就可以搜索出来,搜索黑马程序员能把黑马、程序员相关都搜索出来
  • 搜索的文章结果里词条要高亮显示
  • 用户点击搜索结果任意一条可查看文章详情
②ES导入数据场景分析

黑马头条-day10,黑马头条,jenkins,运维

③创建索引和映射

搜索结果页面展示什么内容?

  • 标题
  • 布局
  • 封面图片
  • 发布时间
  • 作者名称
  • 文章id
  • 作者id
  • 静态url

哪些字段需要索引和分词?

  • 标题
  • 内容

使用Kibana添加映射
索引库名称:app_info_article

PUT /app_info_article
{
    "mappings":{
        "properties":{
            "id":{
                "type":"long"
            },
            "publishTime":{
                "type":"date"
            },
            "layout":{
                "type":"integer"
            },
            "images":{
                "type":"keyword",
                "index": false
            },
            "staticUrl":{
                "type":"keyword",
                "index": false
            },
            "authorId": {
                "type": "long"
            },
            "authorName": {
                "type": "keyword"
            },
            "title":{
                "type":"text",
                "analyzer":"ik_max_word"
            },
            "content":{
                "type":"text",
                "analyzer":"ik_max_word"
            }
        }
    }
}

1.3 索引数据同步

①app文章历史数据导入ES

1、创建es索引和映射
前面创建过了
2、文章微服务集成es功能
导入es服务的依赖
3、编写单元测试将历史状态正常的文章数据同步到es中
数据量特别少一次导入
数据量特别多分批导入,一次一两千条

mapper接口和sql语句

/**
* 查询es需要的全部文章数据
 * @return
 */
List<SearchArticleVo> loadSearchArticleList();
<select id="loadSearchArticleList" resultType="com.heima.model.search.vos.SearchArticleVo">
        select aa.*, aacc.content from ap_article aa
    left join ap_article_config aac on aa.id=aac.article_id
    LEFT JOIN ap_article_content aacc on aa.id = aacc.article_id
where aac.is_down=0 and aac.is_delete=0
    </select>

测试类代码

@Autowired
private RestHighLevelClient client;
/**
 * 将历史文章数据导入ES中
 */
@Test
public void testImportES() throws IOException {
	// 1. 查询所有状态正常的文章列表
	List<SearchArticleVo> searchArticleVoList = apArticleMapper.loadSearchArticleList();
	// 2. 构建BulkRequest批量请求对象
	BulkRequest bulkRequest = new BulkRequest();
	// 3. 遍历文章列表逐一添加IndexRequest
	for (SearchArticleVo searchArticleVo : searchArticleVoList) {
		IndexRequest indexRequest = new IndexRequest("app_info_article");
		indexRequest.source(JSON.toJSONString(searchArticleVo), XContentType.JSON).id(String.valueOf(searchArticleVo.getId()));
		bulkRequest.add(indexRequest);
	}
	// 4. 执行restHighLevelClient的bulk批量插入文档请求
	BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
	// 5. 获取响应结果数据并输出
	int status = bulk.status().getStatus();
	System.out.println("导入完成,响应状态码"+status);
	System.out.println("==============================================================================================");
	BulkItemResponse[] items = bulk.getItems();
	for (BulkItemResponse item : items) {
		String result = item.getResponse().getResult().getLowercase();
		System.out.println(result);
	}
}
②文章实时数据导入ES

跨服务调用的异步,要使用mq
黑马头条-day10,黑马头条,jenkins,运维
生产者

kafka:
    bootstrap-servers: 192.168.200.130:9092
    producer:
      retries: 10
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
// 5. 封装es所需的数据转为JSON,生产到Kafka中
SearchArticleVo searchArticleVo = new SearchArticleVo();
BeanUtils.copyProperties(apArticle,searchArticleVo);
searchArticleVo.setStaticUrl(url);
searchArticleVo.setContent(contentStr);
String articleJson = JSON.toJSONString(searchArticleVo);
kafkaTemplate.send(ArticleConstants.ARTICLE_ES_SYNC_TOPIC,articleJson);

消费者

spring:
  kafka:
    bootstrap-servers: 192.168.200.130:9092
    consumer:
      group-id: ${spring.application.name}
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
@Component
@Slf4j
public class ApArticleImportESListener {
	@Autowired
	private RestHighLevelClient client;

	@KafkaListener(topics = ArticleConstants.ARTICLE_ES_SYNC_TOPIC)
	public void msg (ConsumerRecord<String,String> consumerRecord) {

		if (consumerRecord != null) {

			String articleJSON = consumerRecord.value();
			SearchArticleVo searchArticleVo = JSON.parseObject(articleJSON, SearchArticleVo.class);

			IndexRequest indexRequest = new IndexRequest("app_info_article");
			indexRequest.source(articleJSON, XContentType.JSON).id(searchArticleVo.getId().toString());

			try {
				IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
				String result = indexResponse.getResult().getLowercase();
				String desc = result.equals("created") ? "导入成功" : "导入失败";
				log.info("[异步导入APP文章到ES],导入结果:{}", desc);
			} catch (IOException e) {
				throw new RuntimeException(e);
			}
		}
	}
}

1.4 文章搜索多条件复合查询

①关键词搜索

黑马头条-day10,黑马头条,jenkins,运维

②搜索接口定义

黑马头条-day10,黑马头条,jenkins,运维

2、搜索历史记录

2.1 需求说明

黑马头条-day10,黑马头条,jenkins,运维

  • 异步保存搜索记录
  • 默认查询10条搜索记录,按照搜索关键词的时间倒序
  • 可以删除搜索记录

2.2 数据存储说明

用户的搜索记录,需要给每一个用户都保存一份,数据量大,要求加载速度快,通常这样的数据存储到mongodb更合适,不建议直接存储到关系型数据库中

2.1 异步保存搜索历史

①实现思路

保存的数据量太大,不想同步影响效率,采用异步保存
黑马头条-day10,黑马头条,jenkins,运维

@Service
@Slf4j
public class ApUserSearchServiceImpl implements ApUserSearchService {

	@Autowired
	private MongoTemplate mongoTemplate;

	@Async("taskExecutor")
	@Override
	public void insert(String keyword, Integer userId) {
		// 1. 查询搜索记录
		Query query = Query.query(Criteria.where("keyword").is(keyword).and("userId").is(userId));
		ApUserSearch apUserSearch = mongoTemplate.findOne(query, ApUserSearch.class);
		// 2. 如果搜索记录不存在,则保存搜索记录
		if (apUserSearch == null) {
			apUserSearch = new ApUserSearch();
			SnowflakeIdWorker isWorker = new SnowflakeIdWorker(10, 10);
			apUserSearch.setId(isWorker.nextId());// 使用雪花算法的值当做主键ID
			apUserSearch.setUserId(userId);
			apUserSearch.setKeyword(keyword);
			apUserSearch.setIsDeleted(0); // 未删除
			apUserSearch.setCreatedTime(new Date());
			apUserSearch.setUpdatedTime(new Date());
			mongoTemplate.save(apUserSearch);
			return;
		}
		// 3. 如果搜索记录存在且未删除,则更新updatedTime
		if (apUserSearch.getIsDeleted() == 0) {
			apUserSearch.setUpdatedTime(new Date());
			mongoTemplate.save(apUserSearch);
			return;
		}
		// 4. 如果搜索记录存在且已删除,则更新为未删除及更新updateTime
		apUserSearch.setIsDeleted(0);
		apUserSearch.setUpdatedTime(new Date());
		mongoTemplate.save(apUserSearch);

	}
}

2.2 查看搜索历史列表

①接口定义

按照当前用户,按照时间倒序查询
黑马头条-day10,黑马头条,jenkins,运维

@Override
	public ResponseResult findUserSearch() {

		// 根据条件查询搜索记录列表(条件:userId和isDeleted 结果:updateTime倒序)
		Query query = Query.query(Criteria.where("userId").is(ThreadLocalUtil.getUserId()).and("isDeleted").is(0)).with(Sort.by(Sort.Direction.DESC,"updateTime"));
		query.limit(10);
		List<ApUserSearch> apUserSearchList = mongoTemplate.find(query, ApUserSearch.class);


		return ResponseResult.okResult(apUserSearchList);
	}

2.3 删除搜索历史

根据搜索历史id删除
黑马头条-day10,黑马头条,jenkins,运维

@Override
	public ResponseResult delUserSearch(HistorySearchDto dto) {

		ApUserSearch apUserSearch = mongoTemplate.findById(dto.getId(), ApUserSearch.class);
		if (apUserSearch == null) {
			return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST,"搜索记录不存在");
		}
		// 更新记录为已删除
		apUserSearch.setIsDeleted(1);
		apUserSearch.setUpdatedTime(new Date());
		mongoTemplate.save(apUserSearch);
		return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
	}

3、联想词查询

需求分析

根据用户输入的关键字展示联想词
黑马头条-day10,黑马头条,jenkins,运维

3.1 联想词的来源

通常是网上搜索频率比较高的一些词,通常在企业中有两部分来源:
第一:自己维护搜索词
通过分析用户搜索频率较高的词,按照排名作为搜索词

第二:第三方获取
关键词规划师(百度)、5118、爱站网

3.2 联想词功能实现

接口定义

黑马头条-day10,黑马头条,jenkins,运维

正则表达式说明

黑马头条-day10,黑马头条,jenkins,运维文章来源地址https://www.toymoban.com/news/detail-836489.html

@Service
@Slf4j
public class ApAssociateWordsServiceImpl implements ApAssociateWordsService {

	@Autowired
	private MongoTemplate mongoTemplate;

	@Override
	public ResponseResult search(UserSearchDto dto) {

		// 替换一切特殊字符
		dto.setSearchWords(dto.getSearchWords().replaceAll("[^\u4e00-\u9fa5a-zA-z0-9]", ""));

		List<ApAssociateWords> apAssociateWordsList = mongoTemplate.find(Query.query(Criteria.where("associateWords").regex(".*?\\" + dto.getSearchWords() + ".*")).limit(dto.getPageSize()), ApAssociateWords.class);

		return ResponseResult.okResult(apAssociateWordsList);
	}
}

到了这里,关于黑马头条-day10的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 黑马头条项目学习--Day3: 自媒体文章发布

    自媒体后台搭建 ①:资料中找到heima-leadnews-wemedia.zip解压 拷贝到heima-leadnews-service工程下,并指定子模块 执行leadnews-wemedia.sql脚本 添加对应的nacos配置 ②:资料中找到heima-leadnews-wemedia-gateway.zip解压 拷贝到heima-leadnews-gateway工程下,并指定子模块 添加对应的nacos配置 图片上传的

    2024年02月13日
    浏览(57)
  • 《黑马头条》 ElectricSearch 分词器 联想词 MangoDB day08-平台管理[实战]作业

    1.1)App端搜索-效果图 1.2)今日内容 2.1) 拉取镜像 2.2) 创建容器 2.3) 配置中文分词器 ik 因为在 创建elasticsearch容器的时候,映射了目录,所以可以在宿主机上进行配置ik中文分词器 在去选择ik分词器的时候,需要与elasticsearch的版本好对应上 把资料中的elasticsearch-analysis-ik-7.4.0.zi

    2024年02月13日
    浏览(38)
  • java黑马头条 day5自媒体文章审核 敏感词过滤算法DFA 集成RabbitMQ实现自动审核

      做为内容类产品,内容安全非常重要,所以需要进行对自媒体用户发布的文章进行审核以后才能到app端展示给用户。2 WmNews 中 status 代表自媒体文章的状态 status字段:0 草稿 1 待审核 2 审核失败 3 人工审核 4 人工审核通过   8 审核通过(待发布) 9 已发布 当自媒体用户提交

    2024年02月06日
    浏览(39)
  • 某马头条——day10

      docker化部署 访问http://127.0.0.1:8888/xxl-job-admin/成功登录。 执行器明层appname必须和调度中心里设置的一样  任务代码,重要注解:@XxlJob(“demo JobHandler ”) 这里的demoJobhandler要和调度中心里创建的一样 在调度中心启动之后,就会开始执行了  以下是执行器的属性说明: 属性名称

    2024年01月25日
    浏览(31)
  • 新黑马头条项目经验(黑马)

        (1)简介 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(API Documentation Design Tools for Teams | Swagger)。 它的主要作用是: 使得前后端分离开发更加方便,有利于团队协作 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担

    2024年02月02日
    浏览(45)
  • 面试项目-黑马头条-项目介绍

    B站视频黑马头条视频学习总结,侵权请联系删除 1.1 项目背景 随着智能手机的普及,人们更加习惯于通过手机来看新闻。由于生活节奏的加快,很多人只能利用碎片时间来获取信息,因此,对于移动资讯客户端的需求也越来越高。黑马头条项目正是在这样背景下开发出来。黑

    2024年02月09日
    浏览(40)
  • 黑马头条项目经验&BUG

    同样是配置文件,但与application.yml有所不同 bootstrap.yml的加载比application.yml早 bootstrap.yml作用范围更广,可以被多个应用程序共享(可以在每个服务的application.yml中配置 spring: cloud: config: (name)url ,从而配置bootstrap.yml的位置) bootstrap.yml具有更高的优先级,可以覆盖application.y

    2024年02月14日
    浏览(33)
  • 04-自媒体文章-自动审核-黑马头条

    1)自媒体文章自动审核流程 1 自媒体端发布文章后,开始审核文章 2 审核的主要是审核文章的内容(文本内容和图片) 3 借助第三方提供的接口审核文本 4 借助第三方提供的接口审核图片,由于图片存储到minIO中,需要先下载才能审核 5 如果审核失败,则需要修改自媒体文章的

    2024年03月16日
    浏览(37)
  • AJAX——黑马头条-数据管理平台项目

    功能: 登录和权限判断 查看文章内容列表(筛选,分页) 编辑文章(数据回显) 删除文章 发布文章(图片上传,富文本编辑器) 技术: 基于Bootstrap搭建网站标签和样式 集成wangEditor插件实现富文本编辑器 使用原生JS完成增删改查等业务 基于axios与黑马头条线上接口交互

    2024年04月27日
    浏览(30)
  • 【黑马头条之内容安全第三方接口】

    本笔记内容为黑马头条项目的文本-图片内容审核接口部分 目录 一、概述 二、准备工作 三、文本内容审核接口 四、图片审核接口 五、项目集成 内容安全是识别服务,支持对图片、视频、文本、语音等对象进行多样化场景检测,有效降低内容违规风险。 目前很多平台都支持

    2024年02月15日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包