Elasticsearch京东搜索实例
环境搭建创建一个SpringBoot项目。
配置
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061<properties> <java.version>1.8</java.version> <!--自定一es版本依赖,保证和本地一致--> <elasticsearch.version>7.6.2</elasticsearch.version></properties><dependencies> <!--解析网页。只能解析网页--> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> ...
SpringBoot集成Elasticsearch
官方文档首先我们查看官方文档
https://www.elastic.co/guide/index.html
这里我们选择其他版本。选择7.6
我们一般使用高级的客户端
12345<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.6.2</version></dependency>
环境搭建创建一个SpringBoot项目
所以我们要修改版本与我们的对应
编写配置类
1234567891011@Configurationpublic class ElasticSearchClientConfig { @Bean public RestHighLevelClient restHighLevelClient() ...
Elasticsearch基本操作
所有的操作根据RESETFUL风格
索引PUT /索引名创建索引
我们可以通过先前下载的可视化插件验证结果http://localhost:9100
不过当前是什么都没有的。
我们可以给它在创建的时候指定字段的类型
字符串类型:text keyword
数值类型:long, integer, short, byte, double, float, half_float, scaled_float
日期类型:date
布尔值类型:boolean
二进制类型 binary
等等……
GET /索引名查询索引信息
GET _cat/indices?v查询所有索引信息
DELETE /索引名删除索引
成功删除!
文档简单操作put /索引名/类型(不写默认_doc)/id 添加数据 索引不存在自动创建,字段不存在也会自己创建智能选择类型(存在错误)。
接着在添加几个数据
GET /索引名/类型/id获取数据
POST(PUT)/索引/类型/ID{"字段":"值"...} 更新数据
不过这种请求 ...
IK分词器插件
概述分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个 词,比如 “你好世界” 会被分为”你”,”好”,”世”,”界”,这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题。
如果要使用中文,建议使用ik分词器! IK提供了两个分词算法:ik_smart和 ik_max_word,其中 ik_smart 为最少切分,ik_max_word为最细粒度划分!一会我们测试!
下载安装https://github.com/medcl/elasticsearch-analysis-ik/releases
选择和对应Elasticsearch的版本进行下载(我这里使用的是7.6.2)
下载完成后直接把它放在elasticsearch的plugins目录下解压即可。我重新命名为ik
注意plugins不能存在其他不是插件的文件,例如zip。接着重启Elasticsearch
可以看到已经把这个ik插件加载了。
测试使用kibana来进行测试。
ik_ ...
Elasticsearch核心概念
概述在前面的学习中,我们已经掌握了es是什么,同时也把es的服务已经安装启动,那么es是如何去存储数 据,数据结构是什么,又是如何实现搜索的呢?我们先来聊聊Elasticsearch的相关概念吧!
集群,节点,索引,类型,文档,分片,映射是什么?
ElasticSearch是面向文档的,下面是关系行数据库 和Elasticsearch 客观的对比!
Relational DB
Elasticsearch
数据库(database)
索引(indices)
表(tables)
类型(types逐渐弃用)
行(rows)
文档(documents)
列(columns)
字段(fields)
Elasticsearch(集群)中可以包含多个索引(数据库),每个索引中可以包含多个类型(表),每个类型下又包含多个文档(行),每个文档中又包含多个字段(列)。
物理设计:
elasticsearch 在后台把每个索引划分成多个分片,每分分片可以在集群中的不同服务器间迁移
一个人就是一个集群!默认的集群名称就是elaticsearh
逻辑设计:
一个索引类型中,包 ...
Java序列化深入分析
Java对象的序列化基础知识https://www.kylin.show/46612.html
Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。
使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的”状态”,即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。
除了在持久化对象时会用到对象序列化之外,当使用RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。Java序列化API为处理对象序列化提供了一个标准机制,该API简单易用。
在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化。接着使用对象流传输 ObjectOutputStream,ObjectInputStream。分别 ...
Java中的语法糖
语法糖语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。简而言之,语法糖让程序更加简洁,有更高的可读性。
我们所熟知的编程语言中几乎都有语法糖。作者认为,语法糖的多少是评判一个语言够不够牛逼的标准之一。很多人说Java是一个“低糖语言”,其实从Java 7开始Java语言层面上一直在添加各种糖,主要是在“Project Coin”项目下研发。尽管现在Java有人还是认为现在的Java是低糖,未来还会持续向着“高糖”的方向发展。
语法糖越多,更方便程序员的使用。但是我觉得还是增加了阅读成本。。使用语法糖,你总得认识这个糖🍬吧?
解语法糖前面提到过,语法糖的存在主要是方便开发人员使用。但其实,Java虚拟机并不支持这些语法糖。这些语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖。
说到编译,大家肯定都知道,Java语言中,javac命令可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于Java ...
Java泛型详细分析
什么是泛型Java泛型( generics) 是JDK 5中引⼊的⼀个新特性, 允许在定义类和接口的时候使⽤类型参数( type parameter) 。
声明的类型参数在使⽤时⽤具体的类型来替换。 泛型最主要的应⽤是在JDK 5中的新集合类框架中。
泛型最⼤的好处是可以提⾼代码的复⽤性。 以List接⼜为例,我们可以将String、 Integer等类型放⼊List中, 如不⽤泛型, 存放String类型要写⼀个List接口, 存放Integer要写另外⼀个List接口, 泛型可以很好的解决这个问题。
12345678List arrayList = new ArrayList();arrayList.add("aaaa");arrayList.add(100);for(int i = 0; i< arrayList.size();i++){ String item = (String)arrayList.get(i); Log.d("泛型测试","item = " + item);} ...
Netty心跳检测机制实例
心跳检测机制心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。
实例要求:
编写一个 Netty心跳检测机制案例, 当服务器超过3秒没有读时,就提示读空闲
当服务器超过5秒没有写操作时,就提示写空闲
实现当服务器超过7秒没有读或者写操作时,就提示读写空闲
服务端
服务端添加IdleStateHandler心跳检测处理器,并添加自定义处理Handler类实现userEventTriggered()方法作为超时事件的逻辑处理;
long readerIdleTime:表示多长时间没有读,就会发送一个心跳检测包检测是否连接(读空闲)
long writerIdleTime:表示多长时间没有写,就会发送一个心跳检测包检测是否连接(写空闲)
long allIdleTime:表示多长时间没有读写,就会发送一个心跳检测包检测是否连接 (读写空闲)
当IdleStateEvent触发后,就会传递给管道的下一个handler去处理。通过调用下一个handler的userEventTriggered方法。
123456789101112131415 ...
Netty群聊系统实例
实例要求
编写一个 Netty 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞)
实现多人群聊
服务器端:可以监测用户上线,离线,并实现消息转发功能
客户端:通过channel 可以无阻塞发送消息给其它所有用户,同时可以接受其它用户发送的消息(有服务器转发得到)
目的:进一步理解Netty非阻塞网络编程机制
服务端编写GroupChatServer类
GroupChatServerHandler
private static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748public class GroupChatServer { private int port;//监听端口 public GroupChatServer(int port) { ...