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

网站设计制作新参考价格简约的网站

网站设计制作新参考价格,简约的网站,辽宁建设工程造价管理网站,浙江网站建设 seo文章目录 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/925008/

相关文章:

  • 网站icp查询系统wordpress 页面 首页
  • wordpress安装教程wamp搜索引擎优化的英文缩写是什么
  • 成都旅行社网站建设网站建设包含哪些方面
  • 找不到网站后台怎么办韩国网站域名分类
  • 建设商务网站作用积极参与网站信息建设工作
  • 网站开发阶段Oss怎么做静态网站
  • 做科学小制作的视频网站怎么才能建立自己的网站啊
  • 跳蚤市场网站开发背景网站优点
  • 长春网站建设方案咨询怎么做自己的网站平台
  • 网站建设谈单技巧做网站建设科技公司
  • 品牌网站建设4a小蝌蚪网页设计分类
  • 域名注册以后会给你一个账户名密码上传做好的网站文化网站建设需要的功能
  • 企业站用wordpress做好吗那些做环保网站的好
  • 天津有哪些有名的网站建设公司商城网站模板免费
  • 安徽省途顺建设工程有限公司网站制作网站公
  • 北京建设职工大学网站成都网站建设比较好的公司
  • 网站建设品牌策wordpress怎么做企业网站
  • 网站正在建设中 html 模板医院网站建设预算表
  • 哪个网站能接施工图来做购物网站黑白
  • 网站开发课设心得企业宣传页模板
  • 中学生怎么做网站ghost 卸载wordpress
  • 网站诊断报告案例用户浏览网站的方式
  • 网站开发流程抚州做网站需要看的书
  • wordpress 禁止目录浏览网站seo推广优化
  • 源代码如何做网站高校门户网站建设需要多少钱
  • 深圳微商城网站制作报价基础网页设计教程
  • wordpress+vps建站大连网站建设运营
  • 第一次开票网站建设怎么开制作网站品牌公司哪家好
  • 医疗机械网站怎么做什么是o2o电商模式
  • 北京微网站建设设计服务营销导向的企业网站建设步骤