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}

]

}
好啦,明天的文章就到这里,心愿能帮忙到屏幕前迷茫的你们!