ES简介
Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
Lucene:可以理解为Java的一个核心的类库。
全文检索:只要是和我搜索内容相关的数据,不管是什么数据都会被查出来。
全文检索:
- 因为全文检索使用过程中会建立索引,通过索引来查询数据,创建索引的过程是非常耗时的。但是索引一旦创建就可以多次使用,全文检索主要处理的是查询,所以耗时间创建索引是值得的。
- 但是每次更新,删除数据都需要重新创建索引,所以我们可以定时重新创建索引,比如一天一次。
全文检索应用场景
- ? 对于数据量大、数据结构不固定的数据可采用全文检索方式搜索,比如:百度、Google等搜索引擎、论坛站内搜索、电商网站站内搜索等。
全文检索的实现流程
-
绿色表示索引过程,对要搜索的原始内容进行索引构建一个索引库,索引过程包括:
- 确定原始内容(即要搜索的内容) —->采集文档—->创建文档—->分析文档—->索引文档
-
红色表示搜索过程,从索引库中搜索内容,搜索过程包括:
- 用户通过搜索界面—->创建查询—->执行搜索,从索引库搜索—->渲染搜索结果
-
全文检索大体分两个过程,索引创建 (Indexing) 和搜索索引 (Search) 。
- ? 索引创建:将现实世界中所有的结构化和非结构化数据提取信息,创建索引的过程。
- ? 搜索索引:就是得到用户的查询请求,搜索创建的索引,然后返回结果的过程。
ES安装与启动
windows版本安装(7.4版本)
- ? ElasticSearch分为Linux和Window版本
- ? ElasticSearch的官方地址: https://www.elastic.co/products/elasticsearch
- ? ElasticSearch的官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/index.html
- 安装需要的软件可以在网盘自取:链接:https://pan.baidu.com/s/11Z7tGoTZtSdLaHfjVPd-zQ
提取码:1234
下载好压缩包以后,Window版的ElasticSearch的安装很简单,解压开即安装完毕,解压后的ElasticSearch的目录结构如下:
安装IK分词器插件(对中文分词用的):在plugin目录下创建ik文件夹,将elasticsearch-analysis-ik-7.4.0.zip内容解压到ik目录下:
启动ES服务
点击ElasticSearch下的bin目录下的elasticsearch.bat文件启动
注意:9300(集群用的)是tcp通讯端口,集群间和TCPClient都执行该端口,
? 9200(客户端连接用的如:Java)是http协议的RESTful接口 。
通过浏览器访问ElasticSearch服务器:http://localhost:9200
访问成功后会出现这个页面。
注意事项一:
ElasticSearch是使用java开发的,且本版本的es需要的jdk版本要是1.8以上,所以安装ElasticSearch之前保证JDK1.8+安装完毕,并正确的配置好JDK环境变量,否则启动ElasticSearch失败。
注意事项二:出现闪退,通过路径访问发现“空间不足”
【解决方案】
修改jvm.options文件的22行23行, Elasticsearch启动的时候占用1个G的内存,可改成512m:
-Xmx512m:设置JVM最大可用内存为512M。
-Xms512m:设置JVM初始内存为512m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
jvm.options文件在Config目录下。
Kibana客户端安装(Windows版)
Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。
解压kibana-7.4.0-windows-x86_64.zip(解压很慢**,**耐心等待…)
安装完成后
进入config目录修改kibana.yml第2、28行,配置自身端口和连接的ES服务器地址。
server.port: 5601
elasticsearch.hosts: ["http://localhost:9200"]
进入kibana的bin目录,双击kibana.bat启动:
看到这个后 访问 http://localhost:5601/,出现以下界面说明安装成功。
界面是英文的,如果希望是中文,可以修改kibana.yml第114行:
i18n.locale: “zh-CN”
Elasticsearch head客户端
将ElasticSearch-head-Chrome-0.1.5-Crx4Chrome.crx用压缩工具解压,打开Chrome扩展程序,点” 加载已解压的扩展程序”按钮,找到解压目录即可。
head插件是ES的一个可视化管理插件,用来监视ES的状态,并通过head客户端和ES服务进行交互,比如创建映射、创建索引等。
? 将图标固定在工具条上。
点击head图标,输入ES服务器地址:http://localhost:9200
使用IK分词器
? IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出 了3个大版本。最初,它是以开源项目Lucene为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。
IK分词器3.0的特性如下:
- 采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。
- 采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。
- 对中英联合支持不是很好,在这方面的处理比较麻烦.需再做一次查询,同时是支持个人词条的优化的词典存储,更小的内存占用。
- 支持用户词典扩展定义。
- 针对Lucene全文检索优化的查询分析器IKQueryParser;采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。
下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
在没有使用IK分词器时,默认是standard方式分词,这种方式分词就是一个字就是一个词。
而IK分词器有两种分词模式:ik_max_word和ik_smart模式。
1、ik_max_word
会将文本做最细粒度的拆分,比如会将“乒乓球明年总冠军”拆分为“乒乓球、乒乓、球、明年、总冠军、冠军。
#方式一ik_max_word
GET /_analyze
{
"analyzer": "ik_max_word",
"text": "乒乓球明年总冠军"
}
2、ik_smart 会做粗粒度的拆分,比如会将“乒乓球明年总冠军”拆分为乒乓球、明年、总冠军。
#方式二ik_smart
GET /_analyze
{
"analyzer": "ik_smart",
"text": "乒乓球明年总冠军"
}
ES相关概念
先说Elasticsearch的文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:
{
"name" : "jack",
"sex" : "Male",
"age" : 25,
"birthDate": "1990/05/01",
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
Elasticsearch可以看成是一个数据库,只是和关系型数据库比起来数据格式和功能不一样而已
Elasticsearch核心概念
索引 index
文档存储的地方,类似于MySQL数据库中的数据库概念
类型type
如果按照关系型数据库中的对应关系,还应该有表 的概念。ES中没有表 的概念,这是ES和数据库的一个区别,在我们建立索引之后,可以直接往 索引 中写入文档。
在6.0版本之前,ES中有Type 的概念,可以理解成关系型数据库中的表 ,但是官方说这是一个设计上的失误,所以在6.0版本之后Type 就被废弃了。
字段Field
相当于是数据表的字段,字段在ES中可以理解为JSON数据的键,下面的JSON数据中,name 就是一个字段。
{
"name":"jack"
}
映射 mapping
映射 是对文档中每个字段的类型进行定义,每一种数据类型都有对应的使用场景。
每个文档都有映射,但是在大多数使用场景中,我们并不需要显示的创建映射,因为ES中实现了动态映射。
我们在索引中写入一个下面的JSON文档,在动态映射的作用下,name 会映射成text 类型,age 会映射成long 类型。
{
"name":"jack",
"age":18,
}
自动判断的规则如下:
Elasticsearch中支持的类型如下:
- string类型在ElasticSearch 旧版本中使用较多,从ElasticSearch 5.x开始不再支持string,由text和keyword类型替代。(已经废弃)
- text 类型,需要分词设置text类型,比如Email内容、产品描述,应该使用text类型。
- keyword类型 ,不需要分词设置keyword类型,比如email地址、主机名、状态码和标签。
文档 document
文档 在ES中相当于传统数据库中的行的概念,ES中的数据都以JSON的形式来表示,在MySQL中插入一行数据和ES中插入一个JSON文档是一个意思。下面的JSON数据表示,一个包含3个字段的文档。
{
"name":"jack",
"age":18,
"gender":1
}
一个文档不只有数据。它还包含了元数据(metadata)——关于文档的信息。三个必须的元数据节点是:
节点 | 说明 |
---|
_index | 文档存储的地方 | _type | 文档代表的对象的类 | _id | 文档的唯一标识 |
ElasticSearch的客户端操作
实际开发中,主要有三种方式可以作为elasticsearch服务的客户端:
-
第一种,elasticsearch-head插件 -
第二种,使用elasticsearch提供的Restful接口直接访问 -
第三种,使用elasticsearch提供的API进行访问 因为官方推荐对Elasticsearch操作是在Kibana上。所以下面的操作全在Kibana上进行
1、创建索引
PUT /my-index
{
"mappings": {
"properties": {
"age": { "type": "integer" },
"email": { "type": "keyword" },
"name": { "type": "text" }
}
}
}
注意!!!:写在那里会被当成索引名。
-
向现有映射添加字段 put /my-index/_mapping
{
"properties":{
"sex":{"type":"keyword"}
}
}
-
查看索引的映射 GET /my-index/_mapping
-
查看指定字段的映射 GET /my-index/_mapping/field/sex
-
删除索引 DELETE /my-index
-
修改索引状态 Post /my-index/_close ##关闭索引
Post /my-index/_open ##开启索引
|