共计 3574 个字符,预计需要花费 9 分钟才能阅读完成。
Hello,明天给各位童鞋们分享 ElasticSearch,连忙拿出小本子记下来吧!
(一)介绍
ElasticSearch 的指标就是实现搜寻。在数据量少的时候,咱们能够通过索引去搜寻关系型数据库中的数据,然而如果数据量很大,搜寻的效率就会很低,这个时候咱们就须要一种分布式的搜索引擎。Elasticsearch 是一个基于 Lucene 的搜寻服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。
ES 次要用于全文检索、结构化搜寻以及剖析。ES 的利用非常宽泛,比方维基百科、Github 等都应用 ES 实现搜寻。
(二)外围概念了解
2.1 数据结构
ES 既然是用来搜寻的,那么它必然也须要存储数据。在 Mysql 等关系型数据库中,数据的存储遵循上面的逻辑:
一个数据库(database)中有多个表(tables),每个表有多行数据(rows),每一行数据由多个字段(columns)组成。
ES 中的存储是这样的:
一个索引(indeces)相当于一个数据库(database),每个索引中有多个类型 types(相当于表构造),每个索引中有多个 documents(相当于行),每个 documents 由多个 fields 组成(相当于字段)。
你能够把 ES 了解为他是一个面向文档的数据库。上面用一张图形容 ES 和关系型数据库之间的相似之处:
值得注意的是,在 ES7.x 版本中,types 将缓缓被遗弃,在 8.x 版本中,types 将会彻底弃用。
2.2 索引(indeces)和文档(documents)
ES 中的索引和 Mysql 中的索引不是同一种货色,ES 中的索引是一个文档的汇合,索引就是一个数据库。
后面说了 ES 是面向文档的,文档是 ES 中最重要的单位,文档就是一条条的数据。文档中有几个重要的概念:
1、一篇文档中蕴含多个 key:value
2、文档其实就是一个 JSON 字符串
2.3 分片
ES 是一个分布式搜索引擎,分片就是把一堆数据分布到多个分片中。而索引是对每个分片的一个备份,这些正本同样能解决查问申请。
当初假如集群有两个 node 节点,设置分片数是 5 个,正本数是 1 个,那么数据存储构造将变成上面这样,能够保障正本和分片在不同的节点上:
2.4 倒排索引
为什么 ES 的搜寻这么快,和其中所应用的倒排索引也有肯定的关系。倒排索引建设的是分词和文档之间的映射关系。上面通过一个简略的例子来解说一下什么是倒排索引
原来的数据中咱们通过文档 ID 去关联标签,然而在查问时就须要遍历所有文档。通过倒排索引,咱们能够通过关键词来找到最匹配的文档。
(三)ES 的基本操作
ES 是基于 Restful 格调进行操作的,因而对于习惯了写 crud 的程序员来说,ES 很容易上手。ES 的操作能够应用 Kibana,也能够应用 Postman 间接调用,因为归根结底它就是一个 restful 的操作。我这里应用 Idea 的 ES 插件间接调用。
3.1 创立文档
PUT http://ip:port/ 索引名 / 类型名 /…
{
"key":"value"
}
因为类型名在后续的版本中将会被删除,这里能够用_doc 代表默认类型:
PUT http://ip:port/ 索引名 /_doc/ 文 …
上面给出操作截图
通过 put 创立一个索引之后,咱们能够在 head 中看到对应的数据
3.2 创立带有数据类型的索引
3.1 中创立数据时,没有指定具体的数据类型,咱们当然也能够为索引指定数据类型
PUT http://ip:port/ 索引名
参数示例:
{
“mappings”: {
"properties": {
"name": {"type": "text"},
"address": {"type": "text"}
}
}
}
ES 中的外围数据类型如下:
(1)字符串类型:text, keyword
(2)数字类型:long, integer, short, byte, double, float, half_float, scaled_float
(3)日期:date
(4)日期 纳秒:date_nanos
(5)布尔型:boolean
(6)Binary:binary
(7)Range: integer_range, float_range, long_range, double_range, date_range
3.3 查看索引或者文档的数据
通过 GET 申请能够查看索引以及文档的信息:
GET http://ip:port/ 索引名 #查看索引
GET http://ip:port/ 索引名 / 类型名 /… #查看文档
3.4 批改数据
批改数据和创立数据一样,通过 PUT 操作就会更新原来的数据:
PUT http://ip:port/ 索引名 / 类型名 /…
{
"key":"value"
}
如果是批改的话,响应后果中的 version 就会减少。
另外一种办法是应用 Post 申请:
POST http://ip:port/ 索引名 / 类型名 /…
参数实例:
{
“doc”: {
"name": "javayz4"
}
}
更举荐应用这种形式,如果应用 PUT 办法忘了加某个 key,更新就会变成新增
3.5 删除数据
通过 DELETE 的形式删除数据
DELETE http://ip:port/ 索引名 / 类型名 /… #删除具体的文档
DELETE http://ip:port/ 索引名 #删除索引
(四)ES 的搜寻操作
ES 最重要的就是它的搜寻操作了。
4.1 简略搜寻
间接将搜寻的参数带到链接中:
GET http://ip:port/ 索引名 /_search…
后果如下:
4.2 通过 param 传递参数
除了将参数放到链接当中,还能够将参数通过 JSON 申请体的形式传递,其中 from 和 size 是分页的参数,query 中传递查问条件,_source 示意后果中要展现的列,不写就示意展现所有。
GET http://ip:port/ 索引名 /_search
参数示例:
{
“from”: 0,
“size”: 20,
“query”: {
"match": {"name": "javayz2"}
},
“_source”: [“name”,”address”]
}
除了下面示例中的这些参数之外,还有很多参数能够应用,比方排序:
“sort”: [
{
"age": {"order": "desc"}
}
]
多条件查问:must 示意上面的两个条件都要满足,还能够填 should,示意任意满足其中一个条件即可,或者是 must_not,示意 must 的相同值
“query”: {
"bool": {
"must": [
{
"match": {"name": "javayz"}
},
{
"match": {"address": "hz"}
}
]
}
}
如果你的数据中存在汇合,能够通过空格对多个条件进行查问:
查问过程中还反对高亮查问
“highlight”:{
“pre_tags”: ““,
“post_tags”: “”,
“fields”: {
"name": {}
}
}
(五)分词器
所谓分词器,就是将一段话分成一个个关键字,搜寻时就依照这些关键字进行搜寻。比拟好用的分词器有中文的 IK 分词器。
根本应用
给出下载链接:https://github.com/medcl/elas…
下载和本人 ES 雷同的版本,在 plugin 目录下新建一个 ik 文件夹,将下载的文件解压到 ik 目录下,重新启动即可。
IK 分词器提供了两种算法:
1、ik_smart:起码切分
2、ik_max_word:最细粒划分
首先起码切分是依据字典给出起码的切分:
![上传中 …]()
ik_max_word 是最细粒划分,他会给出最多的后果:
{
“analyzer”: “ik_max_word”,
“text”: “ 我是 Java 工程师 ”
}
后果:
{
“tokens”: [
{
"token": "我",
"start_offset": 0,
"end_offset": 1,
"type": "CN_CHAR",
"position": 0
},
{
"token": "是",
"start_offset": 1,
"end_offset": 2,
"type": "CN_CHAR",
"position": 1
},
{
"token": "java",
"start_offset": 2,
"end_offset": 6,
"type": "ENGLISH",
"position": 2
},
{
"token": "工程师",
"start_offset": 6,
"end_offset": 9,
"type": "CN_WORD",
"position": 3
},
{
"token": "工程",
"start_offset": 6,
"end_offset": 8,
"type": "CN_WORD",
"position": 4
},
{
"token": "师",
"start_offset": 8,
"end_offset": 9,
"type": "CN_CHAR",
"position": 5
}
]
}
好啦,明天的文章就到这里,心愿能帮忙到屏幕前迷茫的你们!