当前位置: 首页 > news >正文

网站网页设计的要求洛阳网站推广公司电话

网站网页设计的要求,洛阳网站推广公司电话,中国建设银行青海分行网站,网络营销的工作岗位有哪些文章目录 Spring整合Elasticsearch引入依赖配置Elasticsearch解决冲突 使用ElasticsearchSpring Data Elasticsearch建立映射关系常用方法添加数据修改数据删除数据搜索数据#xff08;es核心#xff09;步骤构造搜索条件 并 应用进行查询使用查询结果 Spring整合Elasticsear… 文章目录 Spring整合Elasticsearch引入依赖配置Elasticsearch解决冲突 使用ElasticsearchSpring Data Elasticsearch建立映射关系常用方法添加数据修改数据删除数据搜索数据es核心步骤构造搜索条件 并 应用进行查询使用查询结果 Spring整合Elasticsearch 引入依赖 spring-boot-starter-data-elasticsearch dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-elasticsearch/artifactId/dependency配置Elasticsearch cluster-name集群名cluster-nodes集群节点 # ElasticsearchProperties # 配置集群名与es配置文件中的一致 spring.data.elasticsearch.cluster-namenowcoder # 集群节点格式 节点ip地址端口 spring.data.elasticsearch.cluster-nodes127.0.0.1:9300解决冲突 如果项目中使用了redis则需要解决冲突 es和redis都基于netty这两者在启动netty时会产生冲突系统会认为redis已经启动了nettyes无法再启动 要尽可能在服务启动早期的时候修改es.set.netty.runtime.available.processors为 false 修改入口类因为入口类是最先被加载的 PostConstruct 管理bean的生命周期主要用于初始化的方法该注解修饰的方法在构造器调用完以后被执行 在这个初始化方法中修改系统属性就足够早 SpringBootApplication public class CommunityApplication {PostConstructpublic void init() {// 解决netty启动冲突问题// es.set.netty.runtime.available.processors 从 Netty4Utils.setAvailableProcessors() 中找到// 设置系统属性System.setProperty(es.set.netty.runtime.available.processors, false);}public static void main(String[] args) {SpringApplication.run(CommunityApplication.class, args);}}使用Elasticsearch Spring Data Elasticsearch 用于访问es服务器的API ElasticsearchTemplate 有特殊情况DiscussPostRepository处理不了时使用 ElasticsearchRepository 接口需要定义一个子接口继承他声明访问哪些数据Spring会自动实现这个接口 所有的代码都是Spring自动生成的Spring会自动将实体数据和es服务器的索引进行映射因此需要用注解 代码实例 // es可以看成特殊的数据库因此加上注解Repository // Mapper是MyBatid专有注解 // Repository是spring提供的针对数据访问层的注解 Repository // es的接口一般取名XXXRepository该接口访问的是帖子故叫DiscussPostRepository public interface DiscussPostRepository extends ElasticsearchRepositoryDiscussPost, Integer {// 继承时要用泛型声明当前接口要处理的实体类以及实体类中的id类型// 父接口ElasticsearchRepository中 已经定义好了对es服务器访问的增删改查方法// 声明完泛型加上注解之后spring会自动实现自定义的子接口DiscussPostRepository }建立映射关系 要对spring说明哪个实体类和es的索引怎样进行对应建立映射关系映射完成后spring底层就可以帮我们生成实现类 用Document指明 表 和 es 中索引的对应关系 Document ( indexName “…”, type “…”, shards , replicas ) indexName: 实体数据映射到哪个索引上。通常为全小写的类名 type 实体数据映射到哪个类型上。类型已经在逐步被弱化甚至取消了因此写成固定的 _doc shards: 创建几个分片。根据服务器处理能力配 replicas: 创建几个副本。 没有指定索引会创建这个索引并且是根据指定分片和副本进行创建的 指明 实体中属性 和 es中字段 的对应关系 给类中每个 属性 上加注解用于和 索引中的字段 相关联 ​ 表的id属性要 加 id 注解 Id // 与索引中id字段对应private int id;​ 其他普通属性 加 Field注解并指明字段类型 // 用于普通字段需指明字段类型Field(type FieldType.Integer)private int userId;​ 当某些属性 对应的 es字段要用于关键词匹配时需在注解中指明使用的analyzer和searchAnalyzer ​ analyzer为存储时候的解析器/分词器。 当我们存一句话时会提取出关键词并用关键词关联这句话搜索时就可以通过关键词搜到这句话 因此存的时候因该尽可能将一句话拆出尽可能多的关键词以扩大搜索范围。 故需要一个范围非常大的分词器而我们安装的中文分词器中存在这样的分词器——ik_max_word ​ searchAnalyzer为搜索时候解析器/分词器 搜索时输入的句子不需要拆出过多关键词不用拆的过细 如”互联网校招“可以拆出互联网、联网、网校、校招等关键词但实际上我们没有这些意思 此时要使用拆分出尽可能少但满足用户需求的词语——ik_smart Field(type FieldType.Text, analyzer ik_max_word, searchAnalyzer ik_smart)private String content;// 将数据库中帖子存到es服务器里就可以去es服务器中搜索这些帖子了 Document(indexName discusspost, type _doc, shards 6, replicas 3) public class DiscussPost {Id // 与索引中id字段对应private int id;// userId为普通字段Field(type FieldType.Integer)private int userId;// 搜帖子主要在title和content中查找Field(type FieldType.Text, analyzer ik_max_word, searchAnalyzer ik_smart)private String title;Field(type FieldType.Text, analyzer ik_max_word, searchAnalyzer ik_smart)private String content;// 不用在这些字段进行搜索就不用analyzer和searchAnalyzer属性Field(type FieldType.Integer)private int type;Field(type FieldType.Integer)private int status;Field(type FieldType.Date)private Date createTime;Field(type FieldType.Integer)private int commentCount;Field(type FieldType.Double)private double score;}常用方法 添加数据 一次添加一条数据save(一条数据) Testpublic void testInsert() {// 给es服务器添加数据save(一条数据)// 在mysql中找到一条数据discussMapper.selectDiscussPostById(241)添加到es服务器// 不用特地创建索引索引不存在时es会帮我们自动创建discussRepository.save(discussMapper.selectDiscussPostById(241));discussRepository.save(discussMapper.selectDiscussPostById(242));discussRepository.save(discussMapper.selectDiscussPostById(243));}一次添加多条数据saveAll(多条数据) Testpublic void testInsertList() {// 一次添加多条数据saveAll(多条数据)// discussMapper.selectDiscussPosts(101, 0, 100) mysql分页查找discussRepository.saveAll(discussMapper.selectDiscussPosts(101, 0, 100));discussRepository.saveAll(discussMapper.selectDiscussPosts(102, 0, 100));discussRepository.saveAll(discussMapper.selectDiscussPosts(103, 0, 100));discussRepository.saveAll(discussMapper.selectDiscussPosts(111, 0, 100));discussRepository.saveAll(discussMapper.selectDiscussPosts(112, 0, 100));discussRepository.saveAll(discussMapper.selectDiscussPosts(131, 0, 100));discussRepository.saveAll(discussMapper.selectDiscussPosts(132, 0, 100));discussRepository.saveAll(discussMapper.selectDiscussPosts(133, 0, 100));discussRepository.saveAll(discussMapper.selectDiscussPosts(134, 0, 100));}修改数据 调用save方法将之前的数据再覆盖一遍 Testpublic void testUpdate() {// 查出第231条数据修改属性DiscussPost post discussMapper.selectDiscussPostById(231);post.setContent(我是新人,使劲灌水.);// 用save覆盖原来的discussRepository.save(post);}删除数据 一次删除一条数据deleteById( id ) Testpublic void testDelete() {discussRepository.deleteById(231);}一次删除所有数据deleteAll 风险高不常用 Testpublic void testDelete() {discussRepository.deleteAll();}搜索数据es核心 步骤 构造搜索条件 并 应用 搜索条件要不要排序、分页、结果要不要高亮显示等 高亮显示给关键词加em标签在文本显示到网页上时前端可以给em加样式 搜索条件构造方式SearchQuery对象实现类是NativeSearchQuery而NativeSearchQueryBuilder是一个可以构造NativeSearchQuery的工具类 SearchQuery searchQuery new NativeSearchQueryBuilder()// 1指定查询条件withQuery// 查询条件由QueryBuilders对象构造multiMatchQuery用于指定查询关键词和查询字段范围.withQuery(QueryBuilders.multiMatchQuery(互联网寒冬, title, content))// 2指定排序条件// 优先按照置顶排序再按分数精品贴会被折算成分数都相同就按创建时间排序.withSort(SortBuilders.fieldSort(type).order(SortOrder.DESC)).withSort(SortBuilders.fieldSort(score).order(SortOrder.DESC)).withSort(SortBuilders.fieldSort(createTime).order(SortOrder.DESC))// 3指定分页条件.withPageable(PageRequest.of(0, 10))// 4指定给哪些字段里匹配词进行高亮显示.withHighlightFields(new HighlightBuilder.Field(title).preTags(em).postTags(/em),new HighlightBuilder.Field(content).preTags(em).postTags(/em))// 5执行即应用搜索条件.build();进行查询 分页查询结果用spring提供的Page对象接收 Page中封装多个实体即当前这一页的实体 方法一用Repository进行搜索 PageDiscussPost page discussRepository.search(searchQuery);存在问题 es返回结果包含原始结果即匹配到的结果 和 高亮显示部分即匹配到的关键词前后一部分内容不是整个内容不会浪费空间 需要将高亮显示部分整合到原始结果中进行一个替换太过麻烦不够完善 问题原因 查询方法discussRepository.search(searchQuery)的源码底层调用如下方法进行查询 elasticTemplate.queryForPage(searchQuery, class, SearchResultMapper)得到的两份数据需要用SearchResultMapper进行组装但默认实现类底层没有组装即底层获取得到了高亮显示部分, 但是没有返回结果里看不到. 方法二直接用ElasticsearchTemplate进行搜索 elasticTemplate. queryForPage(搜索条件, 实体类型, 处理两部分结果合并问题的接口)通过匿名内部类方式实现接口 new SearchResultMapper() {Overridepublic T AggregatedPageT mapResults(SearchResponse response, ClassT aClass, Pageable pageable) {... ...} }实现接口方法 获取搜索命令查询结果 通过response获取搜索命令的数据可能会得到多条数据放在SearchHits中 SearchHits hits response.getHits();判断结果是否为空 搜索命令返回结果的数据量即返回结果有几条数据 if (hits.getTotalHits() 0) {return null; }遍历每一条数据转成目标实体存储 将这些实体存储在集合中ListDiscussPost list for (SearchHit hit : hits)hits中每一条数据hit的形式如下 1处理非高亮显示内容 获取非高亮内容 es的返回数据是json格式SearchHit对象里将json格式对象数据封装成了Map格式 hit.getSourceAsMap()可以获取map形式数据通过指定map的key可以调用每一个字段的值 处理步骤 1对所有的字段不管实际有没有高亮显示都先获取非高亮显示版本 不能直接获取高亮显示内容并存入实体可能导致某些实体属性为空因为不确定具体在哪个字段中匹配到关键字某些字段可能没有匹配到关键字 后续处理高亮显示数据时会用有高亮显示的字段覆盖 实体属性 原来的非高亮内容 hit.getSourceAsMap().get(id)2再把 获取到的任何类型的数据 都转成 字符串 String id hit.getSourceAsMap().get(id).toString();3存到java实体中时转为对应类型 post.setId(Integer.valueOf(id));2处理高亮显示内容 获取高亮显示数据 hit.getHighlightFields()1获取指定字段高亮显示数据 HighlightField contentField hit.getHighlightFields().get(content);高亮数据格式 2判断该字段是否有高亮显示数据有些字段中没有关键字就没有高亮内容 if (contentField ! null)3有高亮显示数据时获取高亮内容第一段 getFragments()返回值是个数组将内容做了分段每一段都是 匹配的词语 前后的一部分内容如上图 由于字段中匹配的词语可能是多个因此我们只需要第一段设置高亮了就可以 contentField.getFragments()[0].toString()4存入实体对应属性此时就替换了属性中非高亮数据 post.setContent(contentField.getFragments()[0].toString());返回一个包含 实体集合 的数据 方法返回值是AggregatedPage类型 因此为需要构造AggregatedPage接口的实现类AggregatedPageImpl 实现类中会传多个参数参数顺序需要看底层源码 // list: 结果集合 // pageable方法的参数 // hits.getTotalHits()数据总条数 return new AggregatedPageImpl(list, pageable, hits.getTotalHits(), response.getAggregations(), response.getScrollId(), hits.getMaxScore());代码汇总 PageDiscussPost page elasticTemplate.queryForPage(searchQuery, DiscussPost.class, new SearchResultMapper() {Overridepublic T AggregatedPageT mapResults(SearchResponse response, ClassT aClass, Pageable pageable) {SearchHits hits response.getHits();if (hits.getTotalHits() 0) {return null;}ListDiscussPost list new ArrayList();for (SearchHit hit : hits) {DiscussPost post new DiscussPost();// 处理非高亮显示结果String id hit.getSourceAsMap().get(id).toString();post.setId(Integer.valueOf(id));String userId hit.getSourceAsMap().get(userId).toString();post.setUserId(Integer.valueOf(userId));String title hit.getSourceAsMap().get(title).toString();post.setTitle(title);String content hit.getSourceAsMap().get(content).toString();post.setContent(content);String status hit.getSourceAsMap().get(status).toString();post.setStatus(Integer.valueOf(status));String createTime hit.getSourceAsMap().get(createTime).toString();// String转DateString--Long--Datepost.setCreateTime(new Date(Long.valueOf(createTime)));String commentCount hit.getSourceAsMap().get(commentCount).toString();post.setCommentCount(Integer.valueOf(commentCount));// 处理高亮显示的结果HighlightField titleField hit.getHighlightFields().get(title);if (titleField ! null) {post.setTitle(titleField.getFragments()[0].toString());}HighlightField contentField hit.getHighlightFields().get(content);if (contentField ! null) {post.setContent(contentField.getFragments()[0].toString());}list.add(post);}return new AggregatedPageImpl(list, pageable,hits.getTotalHits(), response.getAggregations(), response.getScrollId(), hits.getMaxScore());}});使用查询结果 // 一共查到多少数据匹配System.out.println(page.getTotalElements());// 一共有多少页System.out.println(page.getTotalPages());// 当前处在第几页System.out.println(page.getNumber());// 每一页显示多少条数据System.out.println(page.getSize());// 遍历Page中数据逐一查看// Page继承了Iterable接口可以被遍历for (DiscussPost post : page) {System.out.println(post);}
http://www.zqtcl.cn/news/94239/

相关文章:

  • 搞一个公司网站得多少钱中国航天空间站最新消息
  • php移动网站开发微商做图王官方网站
  • 制作网站中英文字体不能为网页设计与制作教程试题
  • 网站建设与管理案例柳洪轶wordpress学校站模板
  • 湖北省和住房建设厅官方网站自媒体专业
  • 榆林网站开发自己建设购物网站
  • 新材建设局网站百度提问首页
  • 网站优化网站建设栅格布局 网站设计
  • 网站建设销售前景网站手机开
  • 网站建站 用户注册北京网站建设方案报价
  • jsp做网站 案例网站模板 招聘
  • 德州建设银行兑换网站服务器网站跳转怎么做的
  • 金华专业做网站公司湖南网站建设服务
  • 企业网站设计沈阳苏宁电器网站建设特点分析
  • 建设工程类公司网站易语言可以做api网站对接吗
  • 青岛做网站皆赴青岛博wordpress 数据库 备份
  • 外贸公司网站空间哈尔滨seo优化专注
  • 建筑行业综合查询平台优化推广联盟
  • 北京管庄网站建设公司开平网站制作
  • 如何做销售直播网站最专业网站建设
  • 太原市住房和城乡建设局的网站首页网络推广服务外包公司
  • 湘icp备 网站建设 农业 湖南稿定设计免费版
  • 公司网站推广方法陕西省住房建设厅官网
  • 网站关键词排名突然没了无锡企业网站建设报价
  • 找做网站的人网站改版 301跳转
  • 网站备案一次就可以了吧营销管理培训课程
  • 怎么做网站背景专做民宿预定的网站
  • wordpress安装谷歌分析代码建网站seo
  • 百度外卖网站建设与维护方法建设 银行网网站
  • 小程序开发定制开发上海优化价格