ElasticSearch
学习一个组件必须先来一个官网:https://www.elastic.co/cn/elasticsearch/
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。
和solr相比的选择优势:
(1)搜索之外还带有分析
(2)ElasticSearch暴露更多的指标
(3)ElasticSearch适合实时搜索
简单安装
学之前先安装起来,咋简单咋来。
(1)从官网下载ElasticSearch
(2)在Liunx创建ElasticSearch用户
groupadd elasticSearch
useradd elasticSearch -g elasticSearch
passwd elasticSearch
(3)修改用户可以打开的文件数目
vim elasticsearch.yml
(4)上传下载的软件包,解压后,修改elasticsearch.yml
vim elasticsearch.yml
(5)修改ElasticSearch解压目录为ElasticSearch用户
chown -R elasticSearch:elasticSearch *
创建一个elasticSearch启动脚本,或者切换到ElasticSearch用户启动elasticSearch
#!/bin/bash
su - elasticSearch <<EOF
cd /opt/elasticSearch/elasticsearch-7.13.2/bin/
./elasticsearch
exit;
EOF
(6)启动后查看启动结果
Linux后台:
WEB页面:
基本应用
使用之前先介绍一下ES的数据结构,在这里感谢尚硅谷,让我又可以白嫖一次。
注:Type在ElasticSearch 6.X中已经弱化,一个index仅一个Type,ElasticSearch 7.X直接去掉了Type字段,
ElasticSearch类似于数据库,基本的基本就是增删改查了。
索引操作:
(1)创建索引
PUT **http://192.168.1.8:9200/**book
加粗部分是ElasticSearch的连接地址,book是需要增加的索引,方法为put方法,具有幂等性,已经增加过再次增加会报错。
(2)查找索引
GET **http://192.168.1.8:9200/**book
加粗部分是ElasticSearch的连接地址,book是需要增加的索引,方法为get方法
(3)查找所有索引
GET http://192.168.1.8:9200/_cat/indices?v
加粗部分是ElasticSearch的连接地址,book是需要增加的索引,方法为get方法
(4)删除索引
DELETE **http://192.168.1.8:9200/**book
加粗部分是ElasticSearch的连接地址,book是需要增加的索引,方法为delete方法,重复删除会报错
文档操作 数据操作
(1)增加数据
_doc(_create)代表创建数据,当数据已存在时,删除现有数据,然后增加数据
POST http://192.168.1.8:9200//book/_doc
post请求体:
{
"name":"zhangfei"
}
返回:
{
"_index": "book",
"_type": "_doc",
"_id": "XEI4NHoBKz5PQ0LDpmsn", //唯一性标识,同样的请求多次发出时,id会变
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 2
}
指定id增加,其实应该叫指定id修改,可以使用PUT也可以使用POST
POST/PUT http://192.168.1.8:9200//book/_doc/2
其中2是指定的id
post请求体:
{
"name":"zhangfei"
}
返回:
{
"_index": "book",
"_type": "_doc",
"_id": "2", //唯一性标识,同样的请求多次发出时,id不会变
"_version": 6,
"result": "updated", //这里看着是更新,其实还是删除后再创建,比如改变请求体,增加age的话,是不会起作用的
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 8,
"_primary_term": 2
}
(2)查询数据
指定id查询
GET http://192.168.1.8:9200//book/_doc/2
其中2是指定的id,如果id不存在时,会报found:false
{
"_index": "book",
"_type": "_doc",
"_id": "2",
"_version": 6,
"_seq_no": 8,
"_primary_term": 2,
"found": true,
"_source": {
"name": "zhangfei"
}
}
查询全部
GET http://192.168.1.8:9200//book/_search
{
"took": 2, //耗费的时间
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4, //命中的结果,命中4个
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "book",
"_type": "_doc",
"_id": "XEI4NHoBKz5PQ0LDpmsn",
"_score": 1,
"_source": {
"name": "zhangfei"
}
},
{
"_index": "book",
"_type": "_doc",
"_id": "XUI9NHoBKz5PQ0LDwWsG",
"_score": 1,
"_source": {
"name": "zhangfei"
}
},
{
"_index": "book",
"_type": "_doc",
"_id": "XkI9NHoBKz5PQ0LDx2tB",
"_score": 1,
"_source": {
"name": "zhangfei"
}
},
{
"_index": "book",
"_type": "_doc",
"_id": "2",
"_score": 1,
"_source": {
"name": "zhangfei"
}
}
]
}
}
(3)修改数据
完全修改在前面已经讲过,部分修改使用update,此时仅能使用POST
POST http://192.168.1.8:9200//book/_update/2
其中2是指定的id,如果id不存在时,会报found:false
post请求体:
{
"doc":{ // update时,必须加上doc
"name":"zhangfei",
"age":"18"
}
}
返回:
{
"_index": "book",
"_type": "_doc",
"_id": "2",
"_version": 7,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 9,
"_primary_term": 2
}
(4)删除数据
指定id删除
DELETE http://192.168.1.8:9200//book/_doc/2
其中2是指定的id,如果id不存在时,会报result:not found
回显:
{
"_index": "book",
"_type": "_doc",
"_id": "XEI4NHoBKz5PQ0LDpmsn",
"_version": 2,
"result": "deleted", //删除
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 10,
"_primary_term": 2
}
复杂查询
(1)条件查询
POST http://192.168.1.8:9200//book/_search
post请求体:
{
"query":{
"match":{
"age":"18"
}
}
}
返回:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.2876821,
"hits": [
{
"_index": "book",
"_type": "_doc",
"_id": "2",
"_score": 0.2876821,
"_source": {
"name": "zhangfei",
"age": "18"
}
}
]
}
}
(2)全量分页查询
POST http://192.168.1.8:9200//book/_search
post请求体:
{
"query":{
"match_all":{
}
},
"from":0, // 第0页,从0开始
"size":2 // 每页两个
}
返回:
{
"took": 116,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "book",
"_type": "_doc",
"_id": "2",
"_score": 1,
"_source": {
"name": "zhangfei",
"age": "18"
}
},
{
"_index": "book",
"_type": "_doc",
"_id": "XUI9NHoBKz5PQ0LDwWsG",
"_score": 1,
"_source": {
"name": "zhangfei"
}
}
]
}
}
(3)全量过滤查询 显示指定字段和排序
POST http://192.168.1.8:9200//book/_search
post请求体:
{
"query":{
"match_all":{
}
},
"_source":["age"], //仅显示age字段
"sort":{
"age":{
"order":"desc" // 按照age排序,此例中有的没有age,因此会报错
}
}
}
返回:
{
"took": 116,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "book",
"_type": "_doc",
"_id": "2",
"_score": 1,
"_source": {
"name": "zhangfei",
"age": "18"
}
},
{
"_index": "book",
"_type": "_doc",
"_id": "XUI9NHoBKz5PQ0LDwWsG",
"_score": 1,
"_source": {
"name": "zhangfei"
}
}
]
}
}
(4)多条件查询
POST http://192.168.1.8:9200//book/_search
多条件与的关系
{
"query":{
"bool":{
"must":[
{
"match":{ "name":"zhangfei"}
},
{
"match":{"age":18}
}
]
}
}
}
多条件或的关系
{
"query":{
"bool":{
"should":[
{
"match":{ "name":"zhangfei"}
},
{
"match":{"age":18}
}
]
}
}
}
范围查询
{
"query":{
"bool":{
"must":[
{
"match":{ "name":"zhangfei"}
},
{
"match":{"age":18}
}
],
"filter":{
"range":{
"age":{
"gt":10 //查询age大于10
}
}
}
}
}
}
(5)全词匹配 完全匹配
POST http://192.168.1.8:9200//book/_search
{
"query":{
"match":{
"name":"小华" // 会拆分成小 和 华,把两个都匹配的检索出来,英文是按照空格拆分的
}
}
}
完全匹配
{
"query":{
"match_phrase":{
"name":"小米" 只能匹配小米
}
}
}
(6)聚合查询 统计查询
POST http://192.168.1.8:9200//book/_search
可以用来分组和求平均值等
(7)映射关系
先创建索引,使用上面已经学过的创建索引
设置索引的数据结构:
POST http://192.168.1.8:9200/user/_mapping
请求体
{
"properties":{
"name":{
"type":"text", //name字段为全词匹配,即小米即匹配小也匹配米
"index":true //name字段允许被索引
},
"sex":{
"type":"keyword", // sex字段为完全匹配,即小米仅匹配小米
"index":true
},
"tel":{
"type":"keyword",
"index":false
}
}
}
查询索引的数据结构:
GET http://192.168.1.8:9200/user/_mapping
{
"user": {
"mappings": {
"properties": {
"name": {
"type": "text"
},
"sex": {
"type": "keyword"
},
"tel": {
"type": "keyword",
"index": false
}
}
}
}
}