index(索引): 相当于 MySQL 的数据库 database
type (类型): 相当于 MySQL 的表 table
document(文档):相当于 MySQL 的数据行
1.2、 倒排索引机制
二、 Docker 安装 Elasticsearch
docker pull elasticsearch:7.4.2 #存储和检索数据
docker pull kibana:7.4.2 #可视化检索数据
# 创建 Elasticsearch 实例
sudo docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms 1024m -Xmx 1024m" -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
# 创建 Kibana 实例
sudo docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.23.150:9200 -p 5601:5601 -d kibana:7.4.2
三、 初步使用 3.1、 保存文档
保存一个数据,指定数据的 索引 、 类型 、 唯一标识
PUT customer/external/1 { "name": "John Doe" }3.2、 查询文档
PUT 和 POST 都可以,
POST 新增。如果不指定 id,会自动生成 id。指定 id 就会修改这个数据,并新增版本号
PUT 可以新增可以修改。PUT 必须指定 id;由于 PUT 需要指定 id,我们一般都用来做修改 *** 作,不指定 id 会报错。
3.3、 更新文档GET customer/external/1
结果:
{
"_index": "customer", //在哪个索引
"_type": "external", //在哪个类型
"_id": "1", //记录 id
"_version": 2, //版本号
"_seq_no": 1, //并发控制字段,每次更新就会+1,用来做乐观锁
"_primary_term": 1, //同上,主分片重新分配,如重启,就会变化
"found": true,
"_source": {
//真正的内容
"name": "John Doe"
}
}
更新携带 ?if_seq_no=0&if_primary_term=1
3.4、 删除 文档 或 索引POST customer/external/1/_update
{
// POST _update 必须加上 "doc"
"doc":{
"name": "John Doew"
}
}
或者
POST customer/external/1
{
"name": "John Doe2"
}
或者
PUT customer/external/1
{
"name": "John Doe"
}
不同:
POST 带 _update 会比对原文档数据,若比对相同,则无 *** 作,且文档 version 不增加
PUT *** 作总会将数据重新保存并增加 version 版本;
看场景;
对于大并发更新,不带 update;
对于大并发查询偶尔更新,带 _update;对比更新,重新计算分配规则。
更新 同时增加属性
POST customer/external/1
{
"doc": {
"name": "Jane Doe",
"age": 20
}
}
PUT 和 POST 都可以
四、 进阶检索DELETE customer/external/1
DELETE customer
ES 支持两种基本方式检索 :
一个是通过使用 REST request URI 发送搜索参数(uri+检索参数)
另一个是通过使用 REST request body 来发送它们(uri+请求体)
Elasticsearch 提供了一个可以执行查询的 Json 风格的 DSL(domain-specific language 领域特 定语言)。这个被称为 Query DSL。
4.2、 match_all4.3 match (分词匹配)GET bank/_search {
"query": {
"match_all": {}
},
"from": 0,
"size": 5,
"sort": [ { "account_number": { "order": "desc" } } ]
}
query 定义如何查询,
match_all 查询类型【代表查询所有的所有】,es 中可以在 query 中组合非常多的查 询类型完成复杂查询
除了 query 参数之外,我们也可以传递其它的参数以改变查询结果。
如 sort,size from+size 限定,完成分页功能
sort 排序,多字段排序,会在前序字段相等时后续字段内部排序,否则以前序为准
4.4 match_phrase(不分词匹配)GET bank/_search {
"query": {
"term": { "age": "mill road" }
}
}
最终查询出 address 中包含 mill 或者 road 或者 mill road 的所有记录,并给出相关性得分
4.5 term(精确匹配,非文本类型)GET bank/_search {
"query": {
"match_phrase": { "address": "mill road" }
}
}
查出 address 中包含 mill road 的所有记录,并给出相关性得分
GET bank/_search {
"query": {
"term": { "age": 18 }
}
}
精确匹配查询 age 为 18 的
4.6 multi_match(多字段匹配)
4.7 复合查询GET bank/_search {
"query": {
"multi_match": {
"query": "mill",
"fields" ["state","addres"]
}
}
}
查出 state 或者 address 包含 mill
4.8 Filter(范围查询)GET bank/_search {
"query": {
"bool": {
"must": [ { "match": { "address": "mill" } },
{ "match": { "gender": "M" } }
],
"should": [ {"match": { "address": "lane" }} ],
"must_not": [ {"match": { "email": "baluba.com" }} ]
}
}
}
address 包含 mill,并且 gender 是 M,如果 address 里面有 lane 最好不过,但是 email 必须不包含 baluba.com
4.9 聚合查询GET bank/_search {
"query": {
"bool": {
"must": [ {"match": { "address": "mill"}} ],
"filter": {
"range": { "balance": { "gte": 10000, "lte": 20000 } // 限定查询范围 [10000,20000]
}
}
}
}
}
GET bank/account/_search
{
"query": { "match_all": {} },
"aggs": {
// 最外层聚合, 按年龄分布聚合
"age_agg": {
"terms": { "field": "age", "size": 100 },
"aggs": {
// 第二层聚合, 按年龄段中的性别聚合
"gender_agg": {
"terms": { "field": "gender.keyword", "size": 100 },
"aggs": {
// 第三层聚合, 按年龄段中的性别计算平均工资
"age_gender_balance_avg": {
"avg": { "field": "balance" }
}
}
},
// 第二层聚合, 按年龄段计算平均工资
"age_balance_avg":{
"avg": { "field": "balance" }
}
}
}
},
"size": 1000
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)