0%

ElasticSearch基本操作

安装篇

下载与配置

官网下载地址:https://www.elastic.co/cn/downloads/

找到自己系统对应的版本,本文以Linux系统为例,只阐述单机版安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 添加新用户
useradd els

# 创建一个soft目录,存放下载的软件
mkdir /soft

# 进入,然后通过xftp工具,将刚刚下载的文件拖动到该目录下
cd /soft
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.1-linux-x86_64.tar.gz

# 解压缩
tar -zxvf elasticsearch-7.9.1-linux-x86_64.tar.gz

#重命名
mv elasticsearch-7.9.1/ elsearch

因为刚刚我们是使用root用户操作的,所以我们还需要更改一下/soft文件夹的所属,改为els用户

1
chown -R els:els /soft/

然后在切换成elsearch用户进行操作

1
2
# 切换用户
su - els

然后我们就可以对我们的配置文件进行修改了

1
2
# 进入到 elsearch下的config目录
cd /soft/elsearch/config

然后找到下面的配置

1
2
3
4
5
6
7
8
9
10
11
12
#打开配置文件
vim elasticsearch.yml

#设置ip地址,任意网络均可访问
network.host: 0.0.0.0

# 修改jvm启动参数
vim conf/jvm.options

#根据自己机器情况修改
-Xms128m
-Xmx128m

然后在修改第二处的配置,这个配置要求我们到宿主机器上来进行配置

1
2
3
4
5
6
# 到宿主机上打开文件
vim /etc/sysctl.conf
# 增加这样一条配置,一个进程在VMAs(虚拟内存区域)创建内存映射最大数量
vm.max_map_count=655360
# 让配置生效
sysctl -p

启动ElaticSearch

首先我们需要切换到 elsearch用户

1
su - els

然后在到bin目录下,执行下面

1
2
3
4
# 进入bin目录
cd /soft/elsearch/bin
# 后台启动
./elasticsearch -d

启动成功后,访问下面的URL

1
http://ip:9200/           注意:服务器上的9200端口必须得打开

如果出现以下信息,表示已经安装成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"name": "node-1",
"cluster_name": "elasticsearch",
"cluster_uuid": "HW4BNS6BTXCFjARA26PIvg",
"version": {
"number": "7.9.1",
"build_flavor": "default",
"build_type": "tar",
"build_hash": "083627f112ba94dffc1232e8b42b73492789ef91",
"build_date": "2020-09-01T21:22:21.964974Z",
"build_snapshot": false,
"lucene_version": "8.6.2",
"minimum_wire_compatibility_version": "6.8.0",
"minimum_index_compatibility_version": "6.0.0-beta1"
},
"tagline": "You Know, for Search"
}

如果出现错误可以查看ElasticSearch日志查看对应错误,或者访问https://u19900101.github.io/2021-06-28-ElasticSearch/#%E9%94%99%E8%AF%AF%E5%88%86%E6%9E%90 查看对应错误的处理方法。

可视化界面

打开chrome的应用商店,在里面搜索ElasticSearch head 安装插件后,配置访问地址 ip:9200就可以看到数据

操作篇

基本概念

索引

  • 索引(index)是ElasticSearch对逻辑数据的逻辑存储,所以它可以分为更小的部分。
  • 可以把索引看成关系型数据库的表,索引的结构是为快速有效的全文索引准备的,特别是它不存储原始值。
  • ElasticSearch可以把索引存放在一台机器或者分散在多台服务器上,每个索引有一或多个分片(shard),每个分片可以有多个副本(replica)。

文档

  • 存储在Elasticsearch中的主要实体叫文档(document)。用关系型数据库来类比的话,一个文档相当于数据库表中的一行记录。
  • ElasticSearch和MongoDB中的文档类似,都可以有不同的结构,但ElasticSearch的文档中,相同字段必须有相同类型。
  • 文档由多个字段组成,每个字段可能多次出现在一个文档里,这样的字段叫多值字段(multivalued)。每个字段的类型,可以是文本、数值、日期等。字段类型也可以是复杂类型,一个字段包含其他子文档或者数组。

映射

  • 所有文档写进索引之前都会先进行分析,如何将输入的文本分割为词条、哪些词条又会被过滤,这种行为叫做映射(mapping)。一般由用户自己定义规则。

文档类型

  • 在ElasticSearch中,一个索引对象可以存储很多不同用途的对象。例如,一个博客应用程序可以保存文章和评论。
  • 每个文档可以有不同的结构。
  • 不同的文档类型不能为相同的属性设置不同的类型。例如,在同一索引中的所有文档类型中,一个叫title的字段必须具有相同的类型。

操作

创建空索引

这里只是空索引,后续加了分词器,需要指明分词器

1
2
3
4
5
6
7
8
9
PUT /haoke
{
"settings": {
"index": {
"number_of_shards": "2", #分片数
"number_of_replicas": "0" #副本数
}
}
}

删除索引

1
2
3
4
5
#删除索引
DELETE /haoke
{
"acknowledged": true
}

插入数据

URL规则: POST /{索引}/{类型}/{id}

1
2
3
4
5
6
7
POST /haoke/user/1001
#数据
{
"id":1001,
"name":"张三",
"age":20,
"sex

更新数据

全局更新
在Elasticsearch中,文档数据是不为修改的,但是可以通过覆盖的方式进行更新。

1
2
3
4
5
6
7
PUT /haoke/user/1001          /索引/类型/id  PUT方法
{
"id":1001,
"name":"张三",
"age":21,
"sex":"女"
}

更新后,对应的数据id不会变化,发生变化的只是字段和version

局部更新
可以看到数据已经被覆盖了。问题来了,可以局部更新吗? – 可以的。前面不是说,文档数据不能更新吗? 其实是这样的:在内部,依然会查询到这个文档数据,然后进行覆盖操作,步骤如下:

  • 1、从旧文档中检索JSON
  • 2、修改它
  • 3、删除旧文档
  • 4、索引新文档
1
2
3
4
5
6
7
8
#注意:这里多了_update标识

POST /haoke/user/1001/_update ** 这里多个_update 标识
{
"doc":{
"age":23
}
}

删除文档

在Elasticsearch中,删除文档数据,只需要发起DELETE请求即可,不用额外的参数

1
DELETE /haoke/user/1001

需要注意的是,result表示已经删除,version也增加了。
如果删除一条不存在的数据,会响应404

搜索数据

根据id搜索数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET /haoke/user/BbPe_WcB9cFOnF3uebvr
#返回的数据如下
{
"_index": "haoke",
"_type": "user",
"_id": "BbPe_WcB9cFOnF3uebvr",
"_version": 8,
"found": true,
"_source": { #原始数据在这里
"id": 1002,
"name": "李四",
"age": 40,
"sex": "男"
}
}

搜索全部数据

1
GET 1 /haoke/user/_search          * 后面_search是固定标识

注意,使用查询全部数据的时候,默认只会返回10条

返回结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 5, // 分片总数
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3, // 返回记录总条数
"relation": "eq"
},
"max_score": 1.0,
"hits": [ // 结果集
{
"_index": "love_v5",
"_type": "_doc",
"_id": "3",
"_score": 1.0,
"_source": {
"id": "3",
"sex": 1,
"gender": "0",
"content": "随时练习说话,思路要清晰",
"heat": "1"
}
},
{
"_index": "love_v5",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"id": "2",
"sex": 1,
"gender": "0",
"content": "任何的时候脑子都要转起来",
"heat": "1"
}
},
{
"_index": "love_v5",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"id": "1",
"sex": 1,
"gender": "0",
"content": "命运只是我们事后的自我校准",
"heat": "1"
}
}
]
}
}

关键字搜索数据

1
2
#查询年龄等于20的用户
GET /haoke/user/_search?q=age:20

DSL搜索

Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。 DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。

1
2
3
4
5
6
7
8
9
POST /haoke/user/_search 
# 请求体
{
"query" : {
"match" : { #match 只是查询的一种
"age": 20
}
}
}

实现:查询年龄大于30岁的男性用户。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
POST /haoke/user/_search
# 请求数据
{
"query" : {
"bool" : {
"filter" : {
"range" : {
"age" : {
"gt" : 30
}
}
},
"must" : {
"match" : {
"sex": "男"
}
}
}
}

全文搜索

1
2
3
4
5
6
7
8
9
POST /haoke/user/_search
#请求数据
{
"query": {
"match": {
"name": "张三 李四" #搜索名字为张三 李四的结果
}
}

高亮显示,只需要在添加一个 highlight即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /haoke/user/_search
# 请求数据
{
"query": {
"match" : {
"name" : "张三 李四"
}
},
"highlight": {
"fields" : {
"name" : {}
}
}
}

聚合

在Elasticsearch中,支持聚合操作,类似SQL中的group by操作。
将年龄进行聚合

1
2
3
4
5
6
7
8
9
10
POST /haoke/user/_search
{
"aggs" : {
"all_interests" : {
"terms" : {
"field" : "age"
}
}
}
}

ElasticSearch核心详解

在Elasticsearch中,文档以JSON格式进行存储,可以是复杂的结构,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"_index": "haoke",
"_type": "user",
"_id": "1005",
"_version": 1,
"_score": 1,
"_source": {
"id": 1005,
"name": "孙七",
"age": 37,
"sex": "女",
"card": {
"card_number": "123456789"
}
}
}

其中,card是一个复杂对象,嵌套的Card对象

元数据

一个文档不只有数据。它还包含了元数据(metadata)——关于文档的信息。三个必须的元数据节点是:

  • _index : 文档存储的地方
  • _type : 文档代表的对象的类
    _id : 文档的唯一标识