Elasticsearch day01
1 Elasticsearch
1.1 Elasticsearch简介
应用开发中一个比较常见的功能是搜索,传统应用的解决方案:数据库的模糊查询。模糊查询存在的问题:
- 海量数据下效率低下
- 功能不够丰富:不够智能、不能高亮
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎。能够在海量的结构化和非结构化的数据中进行快速搜索,帮助我们完成诸如 订单搜索、商品推荐、日志分析、性能监控 等功能。
和Elasticsearch类似的产品还有Apache组织开源的Solr ,Solr和Elasticsearch都是基于Lucene这个Java类库二次开发而成的框架。Solr在功能性、传统搜索应用方面的表现更好,Elasticsearch则在新兴的实时搜索表现更佳。Solr的发展一直都比较平稳,近些年来呈现渐渐的下降趋势,而Elasticsearch则呈现明显上升的趋势。
Elasticsearch的特点:
- Elasticsearch是基于Lucene(Java全文检索工具)的开发的搜索引擎
- Elasticsearch支持分布式,多用户访问,可以轻松的扩展到上百台服务器
- Elasticsearch是近实时的不是实时的搜索引擎,简单说插入一条新数据后并不能保证立刻搜索到,但保证在1s内一定可以搜索到
- Elasticsearch通过简单的RESTful API来隐藏Lucene的复杂性,使得全文检索变得简单
- Elasticsearch使用JSON格式存储数据
1.2 Elasticsearch的安装
克隆一个安装好jdk环境的linux系统
-
修改配置文件limits.conf
vi /etc/security/limits.conf
在最后一行添加下面内容 * soft nofile 65536 * hard nofile 65536 * soft nproc 4096 * hard nproc 4096
-
修改sysctl.conf
vi /etc/sysctl.conf
最后一行添加 vm.max_map_count=262144
运行该命令让sysctl生效
sysctl -p
-
把es安装包上传到opt文件夹里面进行解压,tar -zxvf elasticsearch-6.4.1.tar.gz
-
修改es的配置文件允许远程访问
[root@localhost config]# vi elasticsearch.yml 将55行 #network.host: 192.168.0.1 改为: network.host: 0.0.0.0
注意去除前面的#
-
尝试启动es:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h4GgG83L-1630977897595)(Elasticsearch day01.assets/image-20210618103018743.png)]
es不能使用root用户启动。我们需要添加其他用户。
-
添加es用户,修改es文件夹的所属用户为es,elasticsearch不能使用root用户启动。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VkciylLW-1630977897599)(Elasticsearch day01.assets/image-20210305142204372.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QTMc0xCm-1630977897600)(Elasticsearch day01.assets/image-20210618103815915.png)]
所以我们需要通过linux的权限命令对文件夹进行修改所属用户。
-
使用es用户登录到linux里面,启动es
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WaofZBHM-1630977897602)(Elasticsearch day01.assets/image-20210305142431321.png)]
2 Elasticsearch起步
2.1 REST 回顾
REST(Resource Representational State Transfer)资源在网络传输中以某种表现形式进行状态转移。
REST风格的URI:
- 面向资源
- 通过HTTP的请求方式对资源进行操作
HTTP请求方式:
- GET 对资源的查询
- POST 对资源的新增或者更新
- PUT 对资源的更新或者新增
- DELETE 对资源的删除
2.2 RESTful API操作Elasticsearch
Elasticsearch数据相关的概念:
- 文档:json格式的数据,类似关系型数据库的一行数据。每个文档都会有唯一的id,可以由es生成,也可以由程序员指定
- 字段:每一个文档中的数据字段就相当于关系型数据库中一行的列
- 类型:Elasticsearch中保存数据的容器,类似于MySQL中的表
- 索引:保存有类型,类似于mysql的数据库。
序号 | Elasticsearch | mysql |
---|---|---|
1 | 索引 | 库 |
2 | 类型 | 表 |
3 | 文档 | 行 |
4 | 字段 | 列 |
为方便大家前期对Elasticsearch的数据有一个大体的认识,可以类比关系型数据库的一些概念,但注意2者之间有本质差别不可等价齐观。
2.3 创建和删除索引
创建索引和类型:
PUT /索引名
{
"mappings":{
"类型名":{
"properties":{
"字段名":{
"type":"字段类型"
},
"字段名":{
"type":"字段类型"
}
}
}
}
}
文档中字段的类型:
字符串:keyword,text
数值类型:long,integer,short,byte,double,float
布尔:boolean
日期:date
二进制:binary
案例:
PUT http://192.168.132.109:9200/dang
{
"mappings":{
"book":{
"properties":{
"name":{
"type":"text"
},
"price":{
"type":"double"
}
}
}
}
}
查看索引:
#查看索引
GET /索引名/_mappings
示例:
GET http://192.168.146.40:9200/dang/_mappings
结果:
{
"dang": {
"mappings": {
"book": {
"properties": {
"name": {
"type": "text"
},
"price": {
"type": "double"
}
}
}
}
}
}
删除索引:
#删除索引
DELETE /索引名
示例:
DELETE http://192.168.132.108:9200/dang
#删除所有索引
DELETE http://192.168.132.108:9200/*
结果:
{
"acknowledged": true
}
2.4 操作文档
-
添加文档
操作:
示例: POST http://192.168.232.109:9200/dangdang/news/2 { "title":"新闻标题2", "content":"新闻内容2" } 其中id也可以不添加,系统会自动给我们创建一个id值
结果:
#由es分配id { "_index": "dangdang", "_type": "news", "_id": "z1sqAXgBNdZS7uufAQRX", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1 } #指定文档的id { "_index": "dangdang", "_type": "news", "_id": "2", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 1, "_primary_term": 1 }
-
查询文档
操作:
#查看文档(数据): GET /索引/类型/id值 示例: GET http://192.168.232.109:9200/dangdang/news/_search 查看全部 GET http://192.168.232.109:9200/dangdang/news/1 查看id为1的数据
结果:
#查询全部 { "took": 5, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 2, "max_score": 1.0, "hits": [ { "_index": "dangdang", "_type": "news", "_id": "z1sqAXgBNdZS7uufAQRX", "_score": 1.0, "_source": { "title": "新闻标题3", "content": "新闻内容3" } }, { "_index": "dangdang", "_type": "news", "_id": "2", "_score": 1.0, "_source": { "title": "222", "content": "2222" } } ] } } #根据 id 查询 { "_index": "dangdang", "_type": "news", "_id": "2", "_version": 2, "found": true, "_source": { "title": "222", "content": "2222" } }
-
删除文档
操作:
#删除文档(数据): DELETE /索引/类型/id 示例: DELETE http://192.168.232.109:9200/dangdang/news/1
结果:
{ "_index": "dangdang", "_type": "news", "_id": "_doc", "_version": 2, "result": "deleted",//删除成功 "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 2, "_primary_term": 1 }
-
更新文档
操作:
#更新文档 POST /索引/类型/id { "title":"222", "content":"2222" } 示例: POST http://192.168.232.109:9200/dangdang/news/2 { "title":"222", "content":"2222" }
2.5 Elasticsearch的其他命令
查看es里面现存的所有索引
GET http://192.168.232.109:9200/_cat/indices?v
结果:
health status index uuid pri rep docs.count docs.deleted store.size
yellow open dangdang siHMxmNyTqyzm8pyhVghVg 5 1 2 0 7.8kb
索引、类型、映射这些组成可以由ES通过文档反推,也可以主动创建。在我们不创建索引和类型的情况下也可以直接插入文档数据。
在没有es1和book的情况下我们可以插入一个文档。
POST http://192.168.232.109:9200/es1/book/1
{
"name":"aa",
"price":200
}
4 批量操作
4.1 批量写 _bulk
Bulk API支持在一次请求中,可以对任意的索引执行多种不同的写操作。
语法:
PUT /_bulk
{操作类型以及操作的索引 类型 文档id信息}
{操作用到的数据}
{操作类型以及操作的索引 类型 文档id信息}
{操作用到的数据}
...
操作类型: index和create都是创建,区别是如果相同id的文档存在,index会覆盖,create会报错
update:更新
delete:删除
示例
PUT http://192.168.146.40:9200/_bulk
{"index":{"_index":"dangdang","_type":"book","_id":"1"}}
{"bookName":"红楼梦","author":"曹雪芹","price":19800.0}
{"update":{"_index":"dangdang","_type":"book","_id":"1"}}
{"doc":{"price":"1980.0"}}
{"create":{"_index":"dangdang","_type":"book","_id":"2"}}
{"bookName":"水浒传","author":"施耐庵"}
{"delete":{"_index":"dangdang","_type":"book","_id":"3"}}
//注意最后必须添加一个空行
注意:
- json数据不能主动换行,必须写成一行
- 多个json间必须要换行
- 在文件中json串最后一行下方必须再有一个空行
扩展:
如果在URI路径上指定了索引和类型,那么操作时json串中的条件可以省略对应的值,上面的操作也可以写成如下所示:
PUT http://192.168.146.40:9200/dangdang/book/_bulk
{"index":{"_id":"1"}}
{"bookName":"红楼梦","author":"曹雪芹","price":19800.0}
{"index":{"_id":"1"}}
{"doc":{"price":"1980.0"}}
{"create":{"_id":"2"}}
{"bookName":"水浒传","author":"施耐庵"}
{"delete":{"_id":"3"}}
操作中单条操作的失败,不会影响其它操作。返回结果中包含了每一条操作的结果。
4.2 批量读取_mget
可以一次性的查询多个数据,减少网络连接产生的开销,提高性能。
#批量获取
GET /_mget
{
"docs":[
{索引 类型 等信息},
...
]
}
示例:
GET http://192.168.146.40:9200/_mget
{
"docs":[
{"_index":"dangdang",
"_type":"book",
"_id":1
},
{
"_index":"dangdang",
"_type":"book",
"_id":2
}
]
}
如果在URI路径上指定了索引和类型,那么操作时json串中的条件可以省略对应的值,上面的操作也可以写成如下所示:
GET http://192.168.146.40:9200/dangdang/book/_mget
{
"docs":[
{"_id":1},
{"_id":2}
]
}
数据,减少网络连接产生的开销,提高性能。
#批量获取
GET /_mget
{
"docs":[
{索引 类型 等信息},
...
]
}
示例:
GET http://192.168.146.40:9200/_mget
{
"docs":[
{"_index":"dangdang",
"_type":"book",
"_id":1
},
{
"_index":"dangdang",
"_type":"book",
"_id":2
}
]
}
如果在URI路径上指定了索引和类型,那么操作时json串中的条件可以省略对应的值,上面的操作也可以写成如下所示:
GET http://192.168.146.40:9200/dangdang/book/_mget
{
"docs":[
{"_id":1},
{"_id":2}
]
}