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

甘肃省城乡建设局网站宁波建站服务

甘肃省城乡建设局网站,宁波建站服务,北京市城乡建设协会官方网站,做出网站目录 前言 什么是es#xff1f; 为什么要使用es#xff1f; es查询的原理#xff1f; es需要准备什么#xff1f; es基本用法 创建工程 添加依赖 创建操作es的文件 使用ik分词插件 Spring Data 项目中引入Spring Data 添加依赖 添加配置 创建操作es的业务逻…目录 前言 什么是es 为什么要使用es es查询的原理 es需要准备什么  es基本用法 创建工程 添加依赖 创建操作es的文件 使用ik分词插件 Spring Data 项目中引入Spring Data 添加依赖 添加配置 创建操作es的业务逻辑 创建数据模型 创建持久层 测试 自定义查询 单条件查询 多条件查询 结语 前言 接上一篇微服务这一篇将对es进行讲解。应该没有谁的数据库就三五百条数据吧不三五千条也实在是不多的如果是微服务项目没个百万级千万级数据好意思用es总之我是不好意思用的。很多时候谈到微服务总是觉得很难实际上微服务是由很多独立的模块组装起来的一个项目也就是功能多了点服务多了点其实也没什么可怕的如果你看完了上一篇微服务那相信你对微服务已经基本了解了既然是微服务项目那怎么少的了es呢今天的目标就是要让大家学会es的使用那我们现在就开始吧。 什么是es es全称Elasticsearch开发界简称es如果你是做开发的和后台接触时多多少少应该听过他们说esredis这些不知所谓的名词今天你学习这部分内容就是当初不明所以的东西es。 首先声明es不是SpringCloud的组件也并不是Java专属的其他的后端语言也可以使用es。由于es是一个由Java开发的软件所以启动需要Java环境变量。 es有一个中文名字叫全文搜索引擎它的优点是可以从大量数据中根据指定的关键字快速的匹配出相关的内容。注意这个快速我们使用es是为了提高查询的效率的所以es提供了相应的控制器方法供我们调用。es也有数据库那味儿我们搜索的数据也会进行相应的存储而存储是放在硬盘上的他的核心搜索功能来自于Java的一个叫Lucene的APIes在Lucene的基础上开发出了一个功能全面的开箱即用的全文搜索引擎。 和es具有相同功能的软件还有Solr和MongoDB。 为什么要使用es 说起来数据库并不算Java的专属同样的es也不是。我们目前所使用的数据库如mysqlmariaDBoracle等都是关系型数据库而关系型数据库都有一个致命缺点前模糊的模糊查询不能使用索引。这就麻烦了如果白百万乃至千万级的数据搜索一条前模糊数据等个10s20s的那谁能受的了就说淘宝京东之流我们搜索数据在网络没问题的情况下从来没超过3s吧甚至有的1s内就出来了这就是es的能力使用它优化后的相同查询效率能提高100倍可怕所以再大型的数据查询也能控制在毫秒级别这就相当可观了。 所以还需要继续说下去吗详细你已经知道es的能力那就准备在项目里用起来吧。 es查询的原理 吃面不吃蒜味道少一半。知道什么是es和为什么使用es之后我们还需要了解es的查询机制来了解它为什么这么快为什么呢我们来看看。 在使用查询时如果不使用es选择数据库查询若是有索引的加持还好但若是没有索引或者查询的内容是开头的部分那数据库就有些无能为力了只能使用低效的全表查询性能非常差。 而使用es它可以利用添加数据库完成数据的分词倒排索引形成一个庞大的索引库在查询时通过索引库就可以得到符合条件的数据我们可以认为es是一本书索引库就是页码这样就大大缩小了查询的范围。 下面我们通过一个案例来说明 数据库存储的可能会进行搜索的内容表 id内容1斗战胜佛孙悟空2齐天大圣孙悟空3花果山水帘洞美猴王孙悟空4.......... 分词库 分词id分词对应id1斗战胜佛12齐天大圣23花果山34水帘洞35美猴王36孙悟空123 看明白了吗分词库就是一个索引的作用他会对应你要搜索的这个分词所对应的可能存在的所有的内容的id这样就像是一本书了。 此处内容需要理解若是需要了解数据库的数据结构和索引相关的内容可以移步 Java开发 - 数据库中的基本数据结构 Java开发 - 数据库索引的数据结构 es需要准备什么  官网地址下载 Elastic 产品 | Elastic 官方在c站也有自己的博客地址Elasticsearch 简介_Elastic 中国社区官方博客的博客-CSDN博客  内容也很多大家也可以自己去看看里面的内容。对于es不算是经常使用因为很多公司很多项目根本用不到这玩意量级都没有达到这才是最尴尬的事情。请大家自行下载一个7.x的版本地址es下载 博主这里是Mac版本Windows版本也差不多在bin文件夹下 Windows双击运行elasticsearch.bat文件Mac需要在控制台先进入bin目录接着输入 ./elasticsearch 期间会多次弹出不明开发者app的提示隐私中允许打开启动需要花费几十秒等看到窗口有started字样就地阿彪启动成功了此时可在浏览器输入以下URL判断是否启动成功localhost:9200 浏览器返回如下数据则表示启动成功 es基本用法 其实对于es我是很不想讲的它的内容很复杂操作起来也不简单和注册nacos这些比起来要麻烦我也不敢说自己能玩得转es但微服务已经讲了箭在弦不得不发我就献丑了。 前面我们已经启动了es这是一个好的开头接下来我们来学习如何使用es。这需要我们先建一个es的工程。这个工程还存在于我们上一篇的微服务的工程中没看上一篇的同学可以选择接着看也可以先去看微服务。 创建工程 添加依赖 在添加依赖之前search工程也需要在主工程中父子相认 modulesmodulecloud-commons/modulemodulecloud-bussiness/modulemodulecloud-cart/modulemodulecloud-order/modulemodulecloud-stock/modulemodulegateway/modulemodulesearch/module /modules  接着search工程的pom文件夹内容如下 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.codingfire/groupIdartifactIdcloud/artifactIdversion0.0.1-SNAPSHOT/version/parentgroupIdcom.codingfire/groupIdartifactIdsearch/artifactIdversion0.0.1-SNAPSHOT/versionnamesearch/namedescriptionDemo project for Spring Boot/descriptiondependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependency/dependencies/project 创建操作es的文件 在这里要专门创建一个用于操作es的文件主要是用来发送各种类型请求。下面跟着博主一起动手 选中search新建最下方HTTP Request就叫es.http默认是http的后缀此文件也被称为http clientclient是客户端的意思也就说这个文件可以发送请求不局限于get和post。 创建完之后我们来向es发送请求 ### 注释和分隔符,每次编写请求前,都要先编写3个# GET http://localhost:9200 点击运行按钮显示和浏览器内一致就就说明当前文件正常运行。 接着我们来写分词测试 ### ES分词测试 analyze(分析) POST http://localhost:9200/_analyze Content-Type: application/json{text: 齐天大圣孙悟空,analyzer: standard } 运行测试结果看看会将“齐天大圣孙悟空”分解成什么样的分词 POST http://localhost:9200/_analyzeHTTP/1.1 200 OK content-type: application/json; charsetUTF-8{tokens: [{token: 齐,start_offset: 0,end_offset: 1,type: IDEOGRAPHIC,position: 0},{token: 天,start_offset: 1,end_offset: 2,type: IDEOGRAPHIC,position: 1},{token: 大,start_offset: 2,end_offset: 3,type: IDEOGRAPHIC,position: 2},{token: 圣,start_offset: 3,end_offset: 4,type: IDEOGRAPHIC,position: 3},{token: 孙,start_offset: 4,end_offset: 5,type: IDEOGRAPHIC,position: 4},{token: 悟,start_offset: 5,end_offset: 6,type: IDEOGRAPHIC,position: 5},{token: 空,start_offset: 6,end_offset: 7,type: IDEOGRAPHIC,position: 6}] }Response code: 200 (OK); Time: 178ms; Content length: 586 bytes我们发现它直接将每一个字做了分词这好像不是很友好这是因为standard是默认分词器规则就是按照一个字是一个词的方式这就没有意义了。不不不能这么说这个分词器对英文还是很友好的不信你可以试试。 使用ik分词插件 为了解决中文的分词问题我们需要使用开源的分词词库IK实现中文分词下载地址ik 下载完成后在es文件夹下 在plugins文件夹下新建一个文件名叫ik然后将下载的ik文件夹下的所有文件复制到plugin下的ik文件下 接着重启es重启后ik插件才能生效。关闭窗口即可关闭es然后按照上面所说的方法启动。 接着修改analyzer的值如下 {text: 齐天大圣孙悟空,analyzer: ik_smart } 在此运行我们看看中文的分词怎么样 POST http://localhost:9200/_analyzeHTTP/1.1 200 OK content-type: application/json; charsetUTF-8{tokens: [{token: 齐天大圣,start_offset: 0,end_offset: 4,type: CN_WORD,position: 0},{token: 孙悟空,start_offset: 4,end_offset: 7,type: CN_WORD,position: 1}] }Response code: 200 (OK); Time: 2902ms; Content length: 169 bytes现在是我们想要的了 如果还想分的更细一点该怎么办呢修改analyzer的值如下 {text: 齐天大圣孙悟空,analyzer: ik_max_word } 接着运行看看新的分词是什么样的 POST http://localhost:9200/_analyzeHTTP/1.1 200 OK content-type: application/json; charsetUTF-8{tokens: [{token: 齐天大圣,start_offset: 0,end_offset: 4,type: CN_WORD,position: 0},{token: 齐天大,start_offset: 0,end_offset: 3,type: CN_WORD,position: 1},{token: 齐天,start_offset: 0,end_offset: 2,type: CN_WORD,position: 2},{token: 天大圣,start_offset: 1,end_offset: 4,type: CN_WORD,position: 3},{token: 天大,start_offset: 1,end_offset: 3,type: CN_WORD,position: 4},{token: 大圣,start_offset: 2,end_offset: 4,type: CN_WORD,position: 5},{token: 孙悟空,start_offset: 4,end_offset: 7,type: CN_WORD,position: 6},{token: 悟空,start_offset: 5,end_offset: 7,type: CN_WORD,position: 7}] }Response code: 200 (OK); Time: 101ms; Content length: 633 bytes发现分词更细了实际开发中用户不可能按照我们想让他们使用的分词进行搜索所以就需要将词分的的特别细一些这也将会导致占用的存储空间比较大所以使用中还是要按照自己的需求进行分词。 分词器不止ik你也可以选择其他的分词器。 Spring Data Spring Data是Spring提供的一套连接各种第三方数据源的框架集因为在ES的原生状态下我们java代码需要使用socket访问ES过于繁琐SpringData框架则可以简化这一步骤。 官网Spring Data 老外的网站嘛英文你懂的就不是很友好不过别怕博主带你操作Spring Data。 项目中引入Spring Data 添加依赖 总是少不了这一步的在search的工程下pom文件夹添加下面两个依赖 !-- Spring Data Elasticsearch依赖 -- dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-elasticsearch/artifactId /dependency dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactId /dependency  上面的依赖是Spring Data操作es的依赖下面的测试依赖则用于稍后的测试。  添加配置 接着在application.properties添加配置此处也可修改为yml规则大家应该都已经知道了我就不在细说。添加如下配置 创建操作es的业务逻辑 创建数据模型 在search下创建entity包创建People类 package com.codingfire.search.entity;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType;import java.io.Serializable;Data Accessors(chain true) // 生成和链式赋值的set方法 AllArgsConstructor // 自动生成包含全部参数的构造方法 NoArgsConstructor // 自动生成无参构造方法 // SpringData要求我们在实体类中使用特定注解标记 // Document注解标记当前类和ES关联 // indexName指定索引名称,我们这里叫peoples,当操作这个索引时,如果索引不存在,会自动创建 Document(indexName peoples) public class People implements Serializable {// SpingData标记这个字段为当前类主键Idprivate Long id;// SpringData使用Field标记文档中属性的类型和各种特征Field(type FieldType.Text,analyzer ik_max_word,searchAnalyzer ik_max_word)private String name; //全名Field(type FieldType.Keyword)private String bigName; //最厉害的称号Field(type FieldType.Keyword)private String home; //家乡Field(type FieldType.Double)private Double brave; //战力// 图片地址不会称为搜索条件,所以设置indexfalse// 效果是imgPath字段不会生成索引库,节省空间Field(type FieldType.Keyword,index false)private String imgPath; //画像// Text和Keyword都是字符串类型,只是Text会分词,而Keyword不会! }创建持久层 在search下创建repository包在包中创建接口PeopleRepository接口类 : package com.codingfire.search.repository;import com.codingfire.search.entity.People; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.stereotype.Repository;// Spring 家族下持久层名称都叫repositorymybatis我们都叫mapper Repository public interface PeopleRepository extends ElasticsearchRepositoryPeople,Long {} 当前接口继承ElasticsearchRepository父接口后会自动在类中生成基本的增删改查方法可直接使用。 它自动识别或自动生成的规则是我们定义的两个泛型ElasticsearchRepository[实体类名],[主键类型]。 测试 刚刚已经引入了测试的依赖下面我们就在测试类SearchApplicationTests内进行测试。 package com.codingfire.search;import com.codingfire.search.entity.People; import com.codingfire.search.repository.PeopleRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;SpringBootTest class SearchApplicationTests {// 注入SpringData操作Es的持久层对象Autowiredprivate PeopleRepository peopleRepository;//单增Testvoid addOne() {People itemnew People().setId(1L).setName(花果山水帘洞齐天大圣孙悟空).setBigName(斗战胜佛).setHome(花果山).setBrave(10000.0).setImgPath(/s.jpg);// 利用自动生成的方法将item新增到ES,索引不存在会自动创建peopleRepository.save(item);System.out.println(ok);} }先新增一个对象到es运行测试方法  测试成功。接着我们去查询新增的对象 // 按id查询Testvoid getOne(){// SpringData框架自带的按id查询的方法// Optional是一个类似包装类的概念,查询的结果封装到了这个类型中OptionalPeople optionalpeopleRepository.findById(1L);// 需要使用查询内容时使用optional.get()即可System.out.println(optional.get());} 运行代码看看是否能输出我们新增加的对象信息 可以看到人物信息已经返回。测试成功。 有时候我们可能需要批量增加到es中这时候就涉及到批量增和一次性全查 Testvoid addList(){// 实例化一个List集合ListPeople listnew ArrayList();// 将要新增的Item对象保存到这个List中list.add(new People(2L,大唐三藏法师唐三藏,旃檀功德佛,大唐,0.0,/t.jpg));list.add(new People(3L,天蓬元帅猪八戒,净坛使者,高老庄,5000.0,/z.jpg));list.add(new People(4L,卷帘大将沙和尚,金身罗汉,流沙河,3000.0,/s.jpg));// 下面使用SpringData提供的方法执行批量新增peopleRepository.saveAll(list);System.out.println(ok);}// 全查Testvoid getAll(){// 利用SpringData的方法从ES中查询所有数据IterablePeople itemspeopleRepository.findAll();items.forEach(item - System.out.println(item));} 分别运行批量增和批量查询方法博主这里是成功的不知道你那里成功了吗 如果你是按照博主的代码复制的到此你应该是成功了如有问题可查看是否和博主的配置和目录一样。  自定义查询 了解了固定的查询套路那么我们不想按照上面的方式做该怎么办呢这时候就要用到自定义查询了毕竟没有哪家公司的需求是完全相同的自定义查询时一定会用的接下来就来说说自己怎么来定义es的查询。 和数据库查询一样es查询也分为多条件查询和单条件查询下面一起来看看吧。 单条件查询 如果是数据库查询我们查询name中包含“佛”的对象有谁 select * from xxxxxx where big_name like %佛使用es实际就是使用es.http文档中编写的查询语句而在Spring Data的加持下编写查询语句更为简单。 在PeopleRepository接口中添加如下代码 // SpringData自定义查询 // 遵循SpringData框架规定的格式的前提下,编写方法名会自动生成查询逻辑 // query: 表示当前方法是一个查询功能,类似sql中的select // Item\Items: 表示查询结果的实体类,带s的返回集合 // By:标识开始设置条件,类似sql的where // bigName: 要查询的字段名称 // Matches: 是要执行的查询操作,这里是分词查询,类似sql的likeIterablePeople queryItemsByBigNameMatches(String bigName); 这段代码是有固定格式的写的时候要格外注意了当然里面有提示所以一般不会写错。 等下这样查很可能查不到因为只有一个字为了效果我们在所有的name前都加上“西游”俩字接着修改查询方法如下 IterablePeople queryItemsByNameMatches(String name);接着在测试类中测试上面这段代码即可 //单条件自定义查询Testvoid queryOne(){// 查询 ES中title字段包含西游分词的数据IterablePeople itemspeopleRepository.queryItemsByNameMatches(西游);items.forEach(item - System.out.println(item));} 修改完后记得重新运行添加方法接着再运行此查询方法我们查name中有西游俩字的人的信息 很好查询成功。  单条件底层查询语句 ### 单条件搜索 POST http://localhost:9200/peoples/_search Content-Type: application/json{query: {match: { name: 西游 }} } 可以贴入http文件进行验证。  多条件查询 但有时候我们为了精准的找到目标可能会采用多条件查询的方式我们添加多条件查询的方法如下 // 多条件查询 // 两个或多个条件之间直接编写And或Or表示查询逻辑 // 参数名称实际上没有要求必须和字段名称匹配,底层代码是按照参数顺序赋值的IterablePeople queryItemsByNameMatchesAndBigNameMatches(String name,String bigName); 多条件用And或Or来连接。 接着我们在测试方法中进行测试 // 多条件自定义查询Testvoid queryTwo(){IterablePeople itemspeopleRepository.queryItemsByNameMatchesAndBigNameMatches(西游,斗战胜佛);items.forEach(item - System.out.println(item));} 运行测试代码查看结果 这就是我们存入的数据测试成功。  多条件底层查询语句 ### 多字段搜索 POST http://localhost:9200/peoples/_search Content-Type: application/json{query: {bool: {must: [{ match: { name: 西游}},{ match: { bigName: 斗战胜佛}}]}} } 可以贴入http文件进行验证。   对了还需注意一点当查询条件为And时查询语句关键字为must当查询条件为Or时查询语句关键字为should。 结语 以上的操作请务必保证es是运行状态。写到这里本篇es相关内容就要跟大家说再见了整体内容我个人还算是满意基本算是讲清楚了es的使用即使是在真实项目中用法也不过就是如此但是关于一些配置啊服务器方面还是要看各公司自己的情况来决定业务相关的部分这里的代码足以应付那么你学会了吗码文不易且行且珍惜觉得有用就收藏点赞评论吧。
http://www.dnsts.com.cn/news/102726.html

相关文章:

  • 青岛企业建站系统模板网站线上体系
  • 营销型网站建设 兼职北京工商注册代理记账
  • 网站统计页面模板自己学做网站看什么书
  • 桂林企业网站建设网站建设网上商城
  • 做网站的步骤是什么大理州建设局投诉网站
  • 网站域名在哪备案wordpress判断使用模版
  • 淘宝做标题网站手机网站如何做营销
  • 七冶建设集团网站长治电子商务网站建设
  • 酷炫 网站模板南京免费发布信息网站
  • 服饰的网站建设优秀设计方案网站
  • 西安官网seo诊断株洲新站seo
  • 做装修网站公司网页开发工作室
  • 西安网站策划设计北京网站推广营销策划
  • 湖北网站建站系统哪家好作文网站网址
  • 网站宣传工作ui设计包括哪些场景
  • 空间站做网站有什么免费申请网站首选百度
  • 普法网站建设自己做简历网站
  • 苏州企业网站建设电话合肥市蜀山区做个网站多少钱
  • 女生做网站前台c 网站开发htnl
  • 建设医院的网站重庆网站公司
  • 衡阳网站建设要点推广品牌形象设计毕业设计
  • 检测一个网站用什么软件做的方法各大网站博客怎么做推广
  • 淘宝客模板 带程序自动采集 淘宝客网站源码 最新懒人淘宝客源码seo是如何做优化的
  • 佛山企业网站建设教程建设厅网站举报
  • 优秀网站设计作品分析积分动力WordPress
  • 建设电影网站选服务器怎么选设计坞官网首页
  • 花都建站嘉兴房产网站建设
  • 网站开发程序的移交承德信息网络有限公司
  • 哪有网站建设的wordpress注册提示
  • 天津网站备案去哪社交网站盈利吗