ElasticSearch基础

本文介绍了Elasticsearch的基础知识,包括基本名词解释、安装步骤、初步检索操作、进阶检索技巧如SearchAPI和Query DSL,以及如何使用Java操作Elasticsearch。详细讲解了索引、映射、分词器的配置,以及Java客户端的整合和测试。
摘要由CSDN通过智能技术生成

全文搜索属于最常见的需求,开源的Elasticsearch 是目前全文搜索引擎的首选。

它可以快速地储存、搜索和分析海量数据。

一、基本名词

  1. 索引

相当于mysql的数据库

  1. 类型(6.0之后已移除)

相当于mysql的表

  1. 文档

相当于mysql表里的数据,也就是msyql中的行

  1. 属性(字段)

相当于mysql的列名

  1. 映射

相当于mysql中个字段中的数据类型


----es里面所有数据都是json格式保存的

 二、安装

1、下载镜像文件

docker pull elasticsearch:7.4.2 存储和检索数据

docker pull kibana:7.4.2 可视化检索数据

2、创建实例

1). 创建所需文件夹

mkdir -p /mydata/elasticsearch/config (用于存放es配置文件)

mkdir -p /mydata/elasticsearch/data(用于存放es数据)

echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml

  1. . 创建容器实例

docker run --name elasticsearch -p 9200:9200 -p 9300:9300 --privileged=true \

-e "discovery.type=single-node" \

-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \

-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \

-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \

-d elasticsearch:7.4.2

若启动容器之后会闪退,查看日志(Caused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes",)需设置权限运行下列语句

chmod -R 777 /mydata/elasticsearch/  

(该命令表示文件所有者有读写执行权限(4+2+1)、文件所属组有读写执行权限(4+2+1)、其他人有读写执行权限(4+2+1))

之后再启动就不闪退了

(端口9200用于发送请求的端口,端口9300用于es集群节点之间的通讯端口)

(第一个-e表示单节点启动,第二个-e设置占用内存的初始值占用64M与最大值占用256M,避免一启动就直接占满内存导致整个虚拟机卡死)

(第一个-v是将容器内的elasticsearch.yml文件与虚拟机中的elasticsearch.yml进行关联,这样以后修改虚拟机中的文件时将同步至容器内的该文件,后两个-v挂载文件,也是同理,文件夹里有变化会相应同步之容器内的该文件夹中)

三、安装kibana可视化界面

docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.111.200:9200 -p 5601:5601 \

-d kibana:7.4.2

使用它直接访问网页http://192.168.111.200:5601

  • 至此,即可开始直接在网址或者网址打开kibana中使用es了。

四、初步检索

1、_cat

GET /_cat/nodes:查看所有节点(如:http://192.168.111.200:9200/_cat/nodes

GET /_cat/health:查看es 健康状况

GET /_cat/master:查看主节点

GET /_cat/indices:查看所有索引(相当于mysql中的show databases;)

2、索引一个文档(保存)

发送PUT请求:http://192.168.111.200:9200/customer/external/1

请求体:{"name": "John Doe"}

customer:这里是索引,相当于mysql数据库

external:这里是类型,相当于mysql的数据表

1:是标识

最后返回结果如下:

{
    "_index": "customer", //(索引)
    "_type": "external", //(类型)
    "_id": "1", //(保存数据的id)
    "_version": 1, //(版本)
    "result": "created", //(最终的结果:新建)
    "_shards": { //(分片)
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}

当再发送同样的一次时,其中的version和result会改变

{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 2,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 1,
    "_primary_term": 1
}

PUT 和POST 都可以,区别是put必须带id,而post可以不带

POST 新增。如果不指定id,会自动生成id。指定id 就会修改这个数据,并新增版本号

PUT 可以新增可以修改。PUT 必须指定id;由于PUT 需要指定id,我们一般都用来做修改

操作,不指定id 会报错。

3、查询文档

发送get请求:http://192.168.111.200:9200/customer/external/1

{
    "_index": "customer", //在哪个索引    
    "_type": "external", //在哪个类型
    "_id": "1", 
    "_version": 2, //版本号
    "_seq_no": 1, //并发控制字段,每次更新就会+1,用来做乐观锁
    "_primary_term": 1, //同上,主分片重新分配,如重启,就会变化
    "found": true, //(true表示找到了这个数据)
    "_source": { //(查找到的数据内容)
        "name": "John Doe"
    }
}

更新携带?if_seq_no=0&if_primary_term=1可以做一个乐观锁操作

发送put请求http://192.168.111.200:9200/customer/external/1?if_seq_no=1&if_primary_term=1

若seq_no不对,则不能修改

{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 3,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 2,
    "_primary_term": 1
}

再get请求查询:http://192.168.111.200:9200/customer/external/1

seq_no会更新为2,数据也会更新

{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 3,
    "_seq_no": 2,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "name": 1
    }
}

4、更新文档

除上面保存操作中的更新操作,还有如下专门末尾带_update的更新操作

发送post请求:http://192.168.111.200:9200/customer/external/1/_update

请求体中需要写如下doc的固定格式

{
"doc":{
"name": "John Doew"
}
}

返回数据如下

{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 4,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 3,
    "_primary_term": 1
}

若继续发送该请求,会对比原来数据,不会像保存操作那样继续更新版本号,只是结果为noop,表示没有改变的意思

{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 4,
    "result": "noop",
    "_shards": {
        "total": 0,
        "successful": 0,
        "failed": 0
    },
    "_seq_no": 3,
    "_primary_term": 1
}

另外,两种方式都可在更新数据的同时,增加属性,如下:

{
"doc": { "name": "Jane Doe", "age": 20 }
}

即可加入age属性

{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 5,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 4,
    "_primary_term": 1
}

查询之后:http://192.168.111.200:9200/customer/external/1得到

{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 5,
    "_seq_no": 4,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "name": "Jane Doe",
        "age": 20
    }
}

5、删除数据/索引

发送delete请求删除数据:http://192.168.111.200:9200/customer/external/1

{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 6,
    "result": "deleted",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 5,
    "_primary_term": 1
}

发送delete请求删除索引:h

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值