ElasticSearch一:简介、概念、安装、Kibana客户端安装使用、IK分词器、数据管理

2023-10-27

目录

一、ElasticSearch简介

ElasticSearch(简称ES)

应用场景

ElasticSearch与Lucene的关系

哪些公司在使用Elasticsearch

ES vs Solr比较

总结:

ES vs 关系型数据库

Lucene全文检索框架

分词原理之倒排索引

倒排索引总结:

Elasticsearch中的核心概念

二、安装Elasticsearch

修改系统配置,解决启动时候的问题

启动ES服务

三、客户端Kibana安装

客户端可以分为图形界面客户端,和代码客户端.

四、安装IK分词器

指定IK分词器作为默认分词器

五、ES数据管理

六、Restful认识

用户做crud

使用Restful的好处:

查询操作

点赞关注加收藏!后续内容看下一篇:

ElasticSearch二:文档批量操作实现、DSL语法深入解析、文档映射与数据类型、锁机制、集群环境搭建


ElasticSearch专栏所需所有资源软件安装包

elasticsearch7.6.1整套软件安装包.zip

一、ElasticSearch简介

ElasticSearch(简称ES)

Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。

能够达到实时搜索,稳定,可靠,快速,安装使用方便。

客户端支持Java、.NET(C#)、PHP、Python、Ruby等多种语言。

官方网站: https://www.elastic.co/

下载地址:https://www.elastic.co/cn/start

创始人:Shay Banon(谢巴农)

应用场景

ElasticSearch与Lucene的关系

Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库(框架),但是想要使用Lucene,必须使用Java来作为开发语言并将其直接集成到你的应用中,并且Lucene的配置及使用非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。

Lucene缺点:

  1. 只能在Java项目中使用,并且要以jar包的方式直接集成项目中
  2. 使用非常复杂-创建索引和搜索索引代码繁杂

  3. 不支持集群环境-索引数据不同步(不支持大型项目)

  4. 索引数据如果太多就不行,索引库和应用所在同一个服务器,共同占用硬盘.共用空间少

上述Lucene框架中的缺点,ES全部都能解决.

哪些公司在使用Elasticsearch

  1. 京东
  2. 携程
  3. 去哪儿
  4. 58同城
  5. 滴滴
  6. 今日头条
  7. 小米
  8. 哔哩哔哩
  9. 联想
  10. GitHup
  11. 微软
  12. Facebook
  13. 等等...

ES vs Solr比较

ES vs Solr 检索速度

当单纯的对已有数据进行搜索时,Solr更快。

当实时建立索引时, Solr会产生io阻塞,查询性能较差, Elasticsearch具有明显的优势。

大型互联网公司,实际生产环境测试,将搜索引擎从Solr转到 Elasticsearch以后的平均查询速度有了50倍的提升。

总结:

  1. Solr 利用 Zookeeper 进行分布式管理,而Elasticsearch 自身带有分布式协调管理功能。
  2. Solr 支持更多格式的数据,比如JSON、XML、CSV,而 Elasticsearch 仅支持json文件格式。
  3. Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。
  4. Solr 是传统搜索应用的有力解决方案,但 Elasticsearch更适用于新兴的实时搜索应用。

ES vs 关系型数据库

Lucene全文检索框架

什么是全文检索

全文检索是指:

  • 通过一个程序扫描文本中的每一个单词,针对单词建立索引,并保存该单词在文本中的位置、以及出现的次数
  • 用户查询时,通过之前建立好的索引来查询,将索引中单词对应的文本位置、出现的次数返回给用户,因为有了具体文本的位置,所以就可以将具体内容读取出来了

hello what world ====> hello

                                      what

                                      world

分词原理之倒排索引

倒排索引总结:

索引

就类似于目录,平时我们使用的都是索引,都是通过主键定位到某条数据,那么倒排索引呢,刚好相反,数据对应到主键.

这里以一个博客文章的内容为例:

索引

文章ID

文章标题

文章内容

1

浅析JAVA设计模式

JAVA设计模式是每一个JAVA程序员都应该掌握的进阶知识

2

JAVA多线程设计模式

JAVA多线程与设计模式结合

倒排索引

假如,我们有一个站内搜索的功能,通过某个关键词来搜索相关的文章,那么这个关键词可能出现在标题中,也可能出现在文章内容中,那我们将会在创建或修改文章的时候,建立一个关键词与文章的对应关系表,这种,我们可以称之为倒排索引,因此倒排索引,也可称之为反向索引.如:

倒排索引

关键词

文章ID

JAVA

1

设计模式

1、2

多线程

2

注:这里涉及中文分词的问题

 

Elasticsearch中的核心概念

索引 index

一个索引就是一个拥有几分相似特征的文档的集合。比如说,可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引

一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字

映射 mapping

ElasticSearch中的映射(Mapping)用来定义一个文档

mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分词器、是否被索引等等,这些都是映射里面可以设置的

字段Field

相当于是数据表的字段|列

字段类型 Type

每一个字段都应该有一个对应的类型,例如:Text、Keyword、Byte等

文档 document

一个文档是一个可被索引的基础信息单元,类似一条记录。文档以JSON(Javascript Object Notation)格式来表示;

集群 cluster

一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能

节点 node

一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能

 一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch”的集群中

这意味着,如果在网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中

 在一个集群里,可以拥有任意多个节点。而且,如果当前网络中没有运行任何Elasticsearch节点,这时启动一个节点,会默认创建并加入一个叫做“elasticsearch”的集群。

分片和副本 shards&replicas

分片

  • 一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢
  • 为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片
  • 当创建一个索引的时候,可以指定你想要的分片的数量
  • 每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上
  • 分片很重要,主要有两方面的原因

  允许水平分割/扩展你的内容容量

允许在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量

  • 至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch管理的,对于作为用户来说,这些都是透明的

副本

  • 在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做副本分片,或者直接叫副本

副本之所以重要,有两个主要原因

  1. 在分片/节点失败的情况下,提供了高可用性。注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的
  2. 扩展搜索量/吞吐量,因为搜索可以在所有的副本上并行运行。每个索引可以被分成多个分片。一个索引有0个或者多个副本。一旦设置了副本,每个索引就有了主分片和副本分片,分片和副本的数量可以在索引,创建的时候指定。在索引创建之后,可以在任何时候动态地改变副本的数量,但是不能改变分片的数量

二、安装Elasticsearch

创建普通用户

ES不能使用root用户来启动,必须使用普通用户来安装启动。

这里我们创建一个普通用户以及定义一些常规目录用于存放我们的数据文件以及安装包等。

创建一个es专门的用户(必须)

# 使用root用户在服务器执行以下命令

先创建组, 再创建用户:
1)创建 elasticsearch 用户组
[root@localhost ~]# groupadd elasticsearch
		
2)创建用户 wangqi 并设置密码
[root@localhost ~]# useradd wangqi
[root@localhost ~]# passwd wangqi

3)# 创建es文件夹,
并修改owner为wangqi用户
mkdir -p /usr/local/es

4)用户wangqi添加到 elasticsearch 用户组
[root@localhost ~]# usermod -G elasticsearch wangqi
[root@localhost ~]# chown -R wangqi /usr/local/es/elasticsearch-7.6.1

5)设置sudo权限
#为了让普通用户有更大的操作权限,我们一般都会给普通用户设置sudo权限,方便普通用户的操作
#三台机器使用root用户执行visudo命令然后为es用户添加权限
[root@localhost ~]# visudo

#在root ALL=(ALL) ALL 一行下面
#添加wangqi用户 如下:
wangqi ALL=(ALL) ALL
			 
#添加成功保存后切换到wangqi用户操作

[root@localhost ~]# su wangqi
[tlbaiqi@localhost root]$

上传压缩包并解压

将es的安装包下载并上传到服务器的/user/local/es路径下,然后进行解压

使用wangqi用户来执行以下操作,将es安装包上传到指定服务器,并使用es用户执行以下命令解压。

# 解压Elasticsearch
su wangqi
cd /user/local/
tar -zvxf elasticsearch-7.6.1-linux-x86_64.tar.gz -C /usr/local/es/

修改配置文件

修改elasticsearch.yml

进入服务器使用wangqi用户来修改配置文件

cd /usr/local/es/elasticsearch-7.6.1/config
mkdir -p /usr/local/es/elasticsearch-7.6.1/log
mkdir -p /usr/local/es/elasticsearch-7.6.1/data
rm -rf elasticsearch.yml

vim elasticsearch.yml
cluster.name: cluster-es
node.name: node1
path.data: /usr/local/es/elasticsearch-7.6.1/data
path.logs: /usr/local/es/elasticsearch-7.6.1/log
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["服务器IP"]
cluster.initial_master_nodes: ["节点名"]
bootstrap.system_call_filter: false
bootstrap.memory_lock: false
http.cors.enabled: true
http.cors.allow-origin: "*"

修改jvm.option

修改jvm.option配置文件,调整jvm堆内存大小

执行以下命令调整jvm堆内存大小,每个人根据自己服务器的内存大小来进行调整。

cd /usr/local/es/elasticsearch-7.6.1/config
vim jvm.options
-Xms2g
-Xmx2g

修改系统配置,解决启动时候的问题

由于现在使用普通用户来安装es服务,且es服务对服务器的资源要求比较多,包括内存大小,线程数等。所以我们需要给普通用户解开资源的束缚

普通用户打开文件的最大数限制

问题错误信息描述:

max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]

ES因为需要大量的创建索引文件,需要大量的打开系统的文件,所以我们需要解除linux系统当中打开文件最大数目的限制,不然ES启动就会抛错

三台机器使用wangqi用户执行以下命令解除打开文件数据的限制

sudo vi /etc/security/limits.conf

添加如下内容: 注意*不要去掉了

* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

此文件修改后需要重新登录用户,才会生效

普通用户启动线程数限制

问题错误信息描述

max number of threads [1024] for user [es] likely too low, increase to at least [4096]

修改普通用户可以创建的最大线程数

max number of threads [1024] for user [es] likely too low, increase to at least [4096]原因:无法创建本地线程问题,用户最大可创建线程数太小解决方案:修改90-nproc.conf 配置文件。

三台机器使用wangqi用户执行以下命令修改配置文件

Centos6
sudo vi /etc/security/limits.d/90-nproc.conf
Centos7
sudo vi /etc/security/limits.d/20-nproc.conf

找到如下内容:

* soft nproc 1024#修改为
* soft nproc 4096

普通用户调大虚拟内存

错误信息描述:

max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

调大系统的虚拟内存

原因:最大虚拟内存太小

每次启动机器都手动执行下。

三台机器执行以下命令

编辑 /etc/sysctl.conf,追加以下内容:vm.max_map_count=262144 保存后,执行:sysctl -p 

备注:以上三个问题解决完成之后,重新连接secureCRT或者重新连接xshell生效

启动ES服务

三台机器使用wangqi用户执行以下命令启动es服务

nohup /usr/local/es/elasticsearch-7.6.1/bin/elasticsearch 2>&1 &

后台启动ES 进入bin目录 ./elasticsearch -d

启动成功之后jsp即可看到es的服务进程,并且访问页面

http://192.168.21.130:9200/?pretty

能够看到es启动之后的一些信息

注意:如果哪一台机器服务启动失败,那么就到哪一台机器的

/usr/local/es/elasticsearch-7.6.1/log

这个路径下面去查看错误日志

关闭Linux防火墙 永久性生效,重启后不会复原

  1. 开启: chkconfig iptables on
  2. 关闭: chkconfig iptables off

即时生效,重启后复原

  1. 开启: service iptables start
  2. 关闭: service iptables stop

注意:启动ES的时候出现 Permission denied

原因:当前的用户没有对XX文件或目录的操作权限

三、客户端Kibana安装

客户端可以分为图形界面客户端,和代码客户端.

ES主流客户端Kibana,开放9200端口与图形界面客户端交互

  1. 下载Kibana放之/usr/local/es目录中
  2. 解压文件:tar -zxvf kibana-X.X.X-linux-x86_64.tar.gz
  3. 进入/usr/local/es/kibana-X.X.X-linux-x86_64/config目录
  4. 使用vi编辑器:vi kibana.yml

server.port: 5601
server.host: "服务器IP"
elasticsearch.hosts: ["http://IP:9200"]  #这里是elasticsearch的访问地址

5. 启动Kibana

/usr/local/es/kibana-7.6.1-linux-x86_64/bin/kibana

6. 后台启动kibana

nohup ./kibana &

7. 访问Kibana

http://ip:5601/app/kibana

四、安装IK分词器

要使用Elasticsearch来进行中文分词,所以需要单独给Elasticsearch安装IK分词器插件。

以下为具体安装步骤:

1. 下载Elasticsearch IK分词器   

https://github.com/medcl/elasticsearch-analysis-ik/releases

2. 切换到wangqi用户,并在es的安装目录下/plugins创建ik

mkdir -p /usr/local/es/elasticsearch-7.6.1/plugins/ik

3. 将下载的ik分词器上传并解压到该目录

cd /usr/local/es/elasticsearch-7.6.1/plugins/ik
unzip  elasticsearch-analysis-ik-7.6.1.zip 

4. 重启Elasticsearch

5. kibana测试分词效果

POST _analyze
{
"analyzer":"standard",
"text":"我爱你中国"
}

POST _analyze
{
"analyzer": "ik_smart",
"text": "中华人民共和国"
}
#ik_smart:会做最粗粒度的拆分

POST _analyze
{
"analyzer":"ik_max_word",
"text":"我爱你中国"
}
#ik_max_word:会将文本做最细粒度的拆分

指定IK分词器作为默认分词器

ES的默认分词设置是standard,这个在中文分词时就比较尴尬了,会单字拆分,比如我搜索关键词“清华大学”,这时候会按“清”,“华”,“大”,“学”去分词,然后搜出来的都是些“清清的河水”,“中华儿女”,“地大物博”,“学而不思则罔”之类的莫名其妙的结果,这里我们就想把这个分词方式修改一下

于是呢,就想到了ik分词器,有两种ik_smart和ik_max_word。

ik_smart会将“清华大学”整个分为一个词,

而ik_max_word会将“清华大学”分为“清华大学”,“清华”和“大学”,按需选其中之一就可以了。

修改默认分词方法(这里修改school_index索引的默认分词为:ik_max_word):

PUT /school_index
{
"settings" : {
"index" : {
"analysis.analyzer.default.type": "ik_max_word"
}
}
}

五、ES数据管理

ES数据管理概述

ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。

然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。

在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。

ES使用JSON作为文档序列化格式。

JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。

ES存储的一个员工文档的格式示例:

{
"email": "584614151@qq.com",
"name": "张三",
 "age": 30,
 "interests": [ "篮球", "健身" ]

}

基本操作

 

创建索引

格式: PUT /索引名称

PUT /es_db

查询索引

格式: GET /索引名称

GET /es_db

删除索引

格式: DELETE /索引名称

DELETE /es_db  

添加文档

格式: PUT /索引名称/类型/id

PUT /es_db/_doc/1
{
"name": "张三",
"sex": 1,
"age": 25,
"address": "广州天河公园",
"remark": "java developer"
}

PUT /es_db/_doc/2
{
"name": "李四",
"sex": 1,
"age": 28,
"address": "广州荔湾大厦",
"remark": "java assistant"
}

PUT /es_db/_doc/3
{
"name": "rod",
"sex": 0,
"age": 26,
"address": "广州白云山公园",
"remark": "php developer"
}

PUT /es_db/_doc/4
{
"name": "admin",
"sex": 0,
"age": 22,
"address": "长沙橘子洲头",
"remark": "python assistant"
}

PUT /es_db/_doc/5
{
"name": "小明",
"sex": 0,
"age": 19,
"address": "长沙岳麓山",
"remark": "java architect assistant"
}		

修改文档

格式: PUT /索引名称/类型/id

PUT /es_db/_doc/1
{
"name": "测试修改",
"sex": 1,
"age": 25,
"address": "张家界森林公园",
"remark": "php developer assistant"				
}

注意:POST和PUT都能起到创建/更新的作用

  1. 需要注意的是==PUT==需要对一个具体的资源进行操作也就是要确定id才能进行==更新/创建,而==POST==是可以针对整个资源集合进行操作的,如果不写id就由ES生成一个唯一id进行==创建==新文档,如果填了id那就针对这个id的文档进行创建/更新

  2. PUT只会将json数据都进行替换, POST只会更新相同字段的值

  3. PUT与DELETE都是幂等性操作, 即不论操作多少次, 结果都一样

查询文档

格式: GET /索引名称/类型/id

GET /es_db/_doc/1

删除文档

格式: DELETE /索引名称/类型/id

DELETE /es_db/_doc/1

六、Restful认识

Restful是一种面向资源的架构风格,可以简单理解为:使用URL定位资源,用HTTP动词(GET,POST,DELETE,PUT)描述操作。 基于Restful API ES和所有客户端的交互都是使用JSON格式的数据.

其他所有程序语言都可以使用RESTful API,通过9200端口的与ES进行通信

GET查询

PUT添加

POST修改

DELE删除

用户做crud

Get http://localhost:8080/employee/1   
 
Get http://localhost:8080/employees

put http://localhost:8080/employee
{

}
delete http://localhost:8080/employee/1

Post http://localhost:8080/employee/1
{
}

使用Restful的好处:

  1. 透明性,暴露资源存在。

  2. 充分利用 HTTP 协议本身语义,不同请求方式进行不同的操作

查询操作

查询当前类型中的所有文档 _search

  • 格式: GET /索引名称/类型/_search
  • 举例: GET /es_db/_doc/_search
  • SQL:  select * from student

条件查询, 如要查询age等于28岁的 _search?q=*:***

  • 格式: GET /索引名称/类型/_search?q=*:***

  • 举例: GET /es_db/_doc/_search?q=age:28

  • SQL:  select * from student where age = 28

范围查询, 如要查询age在25至26岁之间的 _search?q=***[** TO **]  注意: TO 必须为大写

  • 格式: GET /索引名称/类型/_search?q=***[25 TO 26]

  • 举例: GET /es_db/_doc/_search?q=age[25 TO 26]

  • SQL:  select * from student where age between 25 and 26

根据多个ID进行批量查询 _mget

  • 格式: GET /索引名称/类型/_mget
  • 举例: GET /es_db/_doc/_mget{ "ids":["1","2"] }
  • SQL:  select * from student where id in (1,2)

查询年龄小于等于28岁的 :

  • 格式: GET /索引名称/类型/_search?q=age:<=**
  • 举例: GET /es_db/_doc/_search?q=age:<=28
  • SQL:  select * from student where age <= 28

查询年龄大于28前的 :>

  • 格式: GET /索引名称/类型/_search?q=age:>**
  • 举例: GET /es_db/_doc/_search?q=age:>28
  • SQL:  select * from student where age > 28

分页查询 from=*&size=*

  • 格式: GET /索引名称/类型/_search?q=age[25 TO 26]&from=0&size=1
  • 举例: GET /es_db/_doc/_search?q=age[25 TO 26]&from=0&size=1
  • SQL:  select * from student where age between 25 and 26 limit 0, 1

对查询结果只输出某些字段 _source=字段,字段

  • 格式: GET /索引名称/类型/_search?_source=字段,字段
  • 举例: GET /es_db/_doc/_search?_source=name,age
  • SQL:  select name,age from student

对查询结果排序 sort=字段:desc/asc

  • 格式: GET /索引名称/类型/_search?sort=字段 desc
  • 举例: GET /es_db/_doc/_search?sort=age:desc
  • SQL:  select * from student order by age desc

 

点赞关注加收藏!后续内容看下一篇:

ElasticSearch二:文档批量操作实现、DSL语法深入解析、文档映射与数据类型、锁机制、集群环境搭建

https://blog.csdn.net/Xx__WangQi/article/details/114682740

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ElasticSearch一:简介、概念、安装、Kibana客户端安装使用、IK分词器、数据管理 的相关文章

  • Android - 如何访问 onResume 中 onCreate 中实例化的 View 对象?

    In my onCreate 方法 我正在实例化一个ImageButton View public void onCreate Bundle savedInstanceState super onCreate savedInstanceSt
  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • 用 @DataJpaTest 注释的测试不是用 @Autowired 注释的自动装配字段

    我有一个 Spring Boot 应用程序 其中包含 Spring Data Jpa 存储库 我需要围绕这个存储库运行单元 或组件 测试 我对 Spring Data Jpa 没有太多经验 这是我的测试 这很简单 我无法让它通过 impor
  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • 如何从另一个xml文件动态更新xml文件?

    我想从另一个 xml 文件更新 xml 文件 我使用了一个 xml 文件 如下所示 one xml
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • 使用 Java 在浏览器中下载 CSV 文件

    我正在尝试在 Web 应用程序上添加一个按钮 单击该按钮会下载一个 CSV 文件 该文件很小 大小仅约 4KB 我已经制作了按钮并附加了一个侦听器 文件也准备好了 我现在唯一需要做的就是创建单击按钮时下载 csv 文件的实际事件 假设 fi
  • 如何将 XMP XML 块序列化为现有的 JPEG 图像?

    我有许多 JPEG 图像 其中包含损坏的 XMP XML 块 我可以轻松修复这些块 但我不确定如何将 固定 数据写回图像文件 我目前正在使用 JAVA 但我愿意接受任何能让这项任务变得容易的事情 这是目标关于 XMP XML 的另一个问题
  • 打印包含 JBIG2 图像的 PDF

    请推荐一些库 帮助我打印包含 JBIG2 编码图像的 PDF 文件 PDFRenderer PDFBox别帮我 这些库可以打印简单的 PDF 但不能打印包含 JBIG2 图像的 PDF PDFRenderer尝试修复它 根据 PDFRedn
  • 将 RSA 密钥从 BigIntegers 转换为SubjectPublicKeyInfo 形式

    WARNING 最初的问题是关于 PKCS 1 编码密钥 而问题中的实际示例需要SubjectPublicKeyInfo X 509 编码密钥 我目前正致力于在 java 中从头开始实现 RSA 算法 特别是密钥生成方面 现在我的代码可以给
  • 如何为 Jackson 编写一个包罗万象的(反)序列化器

    当您提前知道类型时 编写自定义序列化器非常容易 例如 MyType一个人可以写一个MyTypeSerializer extends StdSerializer
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • 如何移动图像(动画)?

    我正在尝试在 x 轴上移动船 还没有键盘 我如何将运动 动画与boat png而不是任何其他图像 public class Mama extends Applet implements Runnable int width height i
  • 重写Object类的finalize()方法有什么用?

    据我所知 在java中如果我们想手动调用垃圾收集器 我们可以执行System gc 1 我们在重写的finalize 方法中做了哪些操作 2 如果我们想手动调用JVM垃圾收集器 是否需要重写finalize 方法 我们在重写的 Finali
  • Java 编码风格、局部变量与重复方法调用

    我更喜欢使用局部变量而不是多次调用同一方法 I prefer this Vehicle vehicle person getVehicle if vehicle instanceof Car Car car Car vehicle car

随机推荐

  • Java异常类详解

    目录 异常简介 异常体系 异常的处理 自定义异常类 一 异常简介 1 1 异常定义 异常是运行程序的过程中产生的异常情况 异常的情况是指程序在运行过程中 可能由于外界条件的变更 不设想的不一致 导致出现错误的情况 如数据库连接 异常不同于常
  • C++类对象创建过程(分配空间、赋值和初始化、对象初始化顺序、虚函数表指针)

    http my oschina net alphajay blog 5029 from rss 初看到这个题目 你可能会有些疑惑 C 类对象的创建还有什么好说的 不就是调用构造函数么 实际上情况并不是想象中的那么简单 大量的细节被隐藏或者被
  • Node-RED中配置周期性执行、指定时间阶段执行、指定时间执行事件

    场景 Node RED简介与Windows上安装 启动和运行示例 Node RED简介与Windows上安装 启动和运行示例 霸道流氓气质的博客 CSDN博客 在inject节点可以设置重复触发的周期性事件 比如每两秒输出一次时间 注 博客
  • Windows系统服务器如何磁盘挂载

    桌面远程登录服务器后 服务器桌面上只有一个回收站的 我们在桌面空白处右键属性 gt 桌面 gt 自定义桌面 gt 然后把我的电脑前面的框框勾上 再然后点应用 确定 ok 回到桌面我们就能看到我的电脑了 步骤 点击我们电脑 gt 右键管理 g
  • VSCODE设置位置

    目录 设置位置 用户区 工作区 设置方法 设置编辑器 设置文件 结束 设置位置 VSCODE设置位置分为用户区和工作区 用户区 用户设置是全局的 对所有工作区和项目都有效 用户设置会存储在用户的配置文件夹中 并以settings json文
  • oceanbase 与hbase主要区别

    oceanbase支持跨表的事务 而hbase中支持跨行的事务 这是由他们的设计特别决定的 updateserver实际上是将Hbase所有ReginonServer的memtable聚合在一起 regionserver只服务一部分tabl
  • 编程tips

    一 是XOR 是不等于 if a b 和if a b 对对于聪明的编译器来说效率应该是一样的 二 与 的优先级比 高一级 表达式的结合次序取决于表达式中各种运算符的优先级 优先级从上到下依次递减 最上面具有最高的优先级 逗号操作符具有最低的
  • Spring中AOP

    1 概述 AOP 面向切面编程 将程序中的非业务代码抽取 在不修改业务代码的前提下 为其添加功能 功能增强 面向切面的编程思想底层是为目标创建一个代理对象 让代理对象调用目标类中方法 在代理对象调用时 可以额外的调用其他的方法 增强的方法
  • hduoj 2011

    多项式求和 Problem Description 多项式的描述如下 1 1 2 1 3 1 4 1 5 1 6 现在请你求出该多项式的前n项的和 Input 输入数据由2行组成 首先是一个正整数m m lt 100 表示测试实例的个数 第
  • Linq to Sql : 并发冲突及处理策略

    0 并发冲突的示例 单用户的系统现在应该比较罕见了 一般系统都会有很多用户在同时进行操作 在多用户系统中 涉及到的一个普遍问题 当多个用户 同时 更新 修改或者删除 同一条记录时 该如何更新呢 下图展示了开放式并发冲突的一个示例 假设数据库
  • OpenGL片段列表渲染:实现流畅的大规模场景渲染

    OpenGL片段列表渲染 实现流畅的大规模场景渲染 在实时渲染领域 处理大规模场景是一项重要的任务 然而 传统的渲染方式存在着效率低下 内存消耗大等问题 为了解决这些问题 最近的研究中提出了使用片段列表进行场景渲染的方法 本文将介绍如何使用
  • python批量写入数据

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 python批量写入文件内容 前言 一 使用步骤 1 引入库 前言 提示 这里可以添加本文要记录的大概内容 python批量写入文件内容 提示 以下是本篇文章正文内容 下面案
  • 数字后端——信号完整性分析

    随着光刻和集成电路制造工艺的不断进步 以及芯片的特征尺寸从深亚微米到纳米的迅速采用 人们一方面因为芯片的功能极大提高而受益 另一方面 当逻辑门的沟道长度减小时 门的开关时间会减小 这意味着输出驱动器上升时间变短 或者说时钟频率可以更高 同时
  • Web和Servlet

    Web web开发概述 学习web开发 需要先安装一台web服务器 将开发好的web项目部署在web服务器中供外界访问 web开发环境搭建 Web服务器是指驻留于英特网上某种类型计算机的程序 可以向浏览器等Web客户端提供文档 也可以放置网
  • 万亿级KV存储架构与实践

    一 KV 存储发展历程 我们第一代的分布式 KV 存储如下图左侧的架构所示 相信很多公司都经历过这个阶段 在客户端内做一致性哈希 在后端部署很多的 Memcached 实例 这样就实现了最基本的 KV 存储分布式设计 但这样的设计存在很明显
  • JavaScript 实现 -- 希尔排序

    文章目录 希尔排序 代码实现 时间复杂度和稳定性 希尔排序 希尔排序是插入排序的一种 又称 缩小增量排序 Diminishing Increment Sort 是插入排序的一种更高效的改进版本 希尔排序实际上就是分组的插入排序 希尔排序以步
  • Java图片Base64格式压缩大小至40k之内

    Maven中用到的依赖
  • Docker安装Portainer

    前言 Portainer是一个可视化的容器镜像的图形管理工具 利用Portainer可以轻松构建 管理和维护Docker环境 而且完全免费 基于容器化的安装方式 方便高效部署 Docker安装 拉取镜像 docker pull portai
  • Vue2+Vue3

    文章目录 Vue快速上手 Vue是什么 第一个Vue程序 插值表达式 Vue核心特性 响应式 Vue指令 v html v show 与 v if v else 与 v else if v on v bind v for v model 指
  • ElasticSearch一:简介、概念、安装、Kibana客户端安装使用、IK分词器、数据管理

    目录 一 ElasticSearch简介 ElasticSearch 简称ES 应用场景 ElasticSearch与Lucene的关系 哪些公司在使用Elasticsearch ES vs Solr比较 总结 ES vs 关系型数据库 L