Elasticsearch基础篇
文章目录
前言
公司数据越来越多,海量数据在MySQL中的普通查询以及满足不了需求,所以公司买了阿里云的elastic search服务,使用中遇到了很多问题在这里记录并分享给大家,欢迎我们随时交流
本文章主要还是以spring boot集成ES实战为主,会简单带大家了解一些ES基础知识点
上篇是针对ES的基础语法做了一些简单的介绍,并不包含全部语法,如果大家想从头详细的学习ES还请结合官方文档+网上资料去好好的学习
下篇是更详细的spring boot集成ES的一些API的介绍,想了解这部分的同学直接去下篇即可
一、elastic search是什么?
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
二、我们要掌握哪些知识点
1.索引
ES中的索引你可以理解为MySQL中的表,是数据的集合
我这里用的是阿里云Elasticsearch,版本为7.7.1,自带kibana控制台,下面的操作指令都是在kibana中执行
- 创建索引
PUT /kol_account_weibo1
我这里创建了一个叫kol_account_weibo1的索引,看右边的执行结果,显示成功,那我们紧接着查询一下
- 查询索引
GET /kol_account_weibo1
右边为这个索引的基础信息,包括aliases(索引的别名),mappings(索引的字段信息) 等等
mappings里面有很多知识点,我这里不做讲解,想了解的大家去网上找找资料好好学习
- 设置索引别名
POST _aliases
{
"actions": [
{
"add": {
"index": "kol_account_weibo1",
"alias": "kol_account_weibo"
}
}
]
}
index是索引名,alias为要设置的别名
- 移除索引别名
POST _aliases
{
"actions": [
{
"remove": {
"index": "kol_account_weibo1",
"alias": "kol_account_weibo"
}
}
]
}
index为索引名,alias为要移除的别名
-
查询全部索引信息
-
GET _cat/indices
-
删除索引(谨慎使用)
-
DELETE /kol_account_weibo1
-
根据通配符删除索引(谨慎使用)
-
DELETE /kol_*
2.写入数据
- 插入文档(不指定_id,随机生成)
POST /kol_account_weibo1/_doc
{
"username":"微博管理员",
"fansnum":158581104,
"area":"北京",
"level":1
}
- 插入文档(指定_id)
POST /kol_account_weibo1/_doc/123456789
{
"username":"微博小秘书",
"fansnum":198130473,
"area":"中国",
"level":1
}
3.查询数据
- 普通查询
GET /kol_account_weibo1/_search
这个查询默认返回10条数据
- 分页查询
GET /kol_account_weibo1/_search
{
"size": 10,
"from": 0,
"sort": [
{
"fansnum": {
"order": "desc"
}
}
]
}
size:每页展示数量
from:当前页数
sort:根据哪个字段进行排序,这里是根据fansnum排序
有一点值得注意的是,当这个索引中的数据超过1W条的时候,普通查询是不能查出具体数量的
(在ES 7.x的版本中是这样的,听说6.x的版本会返回具体数量,这个我没有验证过)
如下图
这个索引中的数据量很多,普通查询无法展示出具体的数据量
引入track_total_hits参数,设置为true,放入查询体中,就会查出具体数量
"track_total_hits": true
4.更新数据
ES中更新某一条数据的全部字段信息,用指定_id的插入语句即可,我不做赘述,这里我只介绍一种更新部分字段信息
- 根据id更新部分字段
POST /kol_account_weibo1/_update/123456789
{
"doc": {
"level": 5
}
}
5.删除数据
- 指定id删除
DELETE /kol_account_weibo1/_doc/123456789
- 查询删除(批量删除)
_delete_by_query
POST /kol_account_weibo1/_delete_by_query
{
"query": {
"bool": {
"adjust_pure_negative": true,
"must": [
{
"match": {
"username.keyword": {
"auto_generate_synonyms_phrase_query": true,
"query": "微博",
"zero_terms_query": "NONE",
"fuzzy_transpositions": true,
"boost": 1,
"prefix_length": 0,
"operator": "OR",
"lenient": false,
"max_expansions": 50
}
}
}
],
"boost": 1
}
},
"track_total_hits": true
}
我这里是根据username查询并删除等于”微博’“的数据,右边会显示执行结果
total代表查询到的数量,deleted代表删除数量
5.数据类型(嵌套对象)
- 嵌套对象使用场景-ES官方文档
- 创建ageOfFans字段类型为nested
PUT /kol_account_dy_v1
{
"settings": {
"index": {
"analysis.analyzer.default.type": "ik_smart",
"number_of_shards": "3",
"number_of_replicas": "1"
}
},
"mappings": {
"properties": {
"accountIcon": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"accountName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"accountNo": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"ageOfFans": {
"type" : "nested",
"properties" : {
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"rate" : {
"type" : "float"
}
}
}
}
}
}
- 查询ageOfFans中,
ageOfFans.rate(比例) 在0.2-0.3之间,且 ageOfFans.name(年龄区间) 在35-44岁之间,
或者
ageOfFans.rate(比例) 在0.25-0.3之间,且ageOfFans.name(年龄区间) 在25-34岁之间
GET /kol_account_xhs_test/_search
{
"query": {
"bool": {
"should": [
{
"nested": {
"path": "ageOfFans",
"query": {
"bool": {
"must": [
{
"range": {
"ageOfFans.rate": {
"from": "0.2",
"to": "0.3"
}
}
},
{
"match": {
"ageOfFans.name.keyword": "35-44"
}
}
]
}
}
}
},
{
"nested": {
"path": "ageOfFans",
"query": {
"bool": {
"must": [
{
"range": {
"ageOfFans.rate": {
"from": "0.25",
"to": "0.3"
}
}
},
{
"match": {
"ageOfFans.name.keyword": "25-34"
}
}
]
}
}
}
}
]
}
},
"track_total_hits": true
}
注意:将字段类型设置为 nested 而不是 object 后,每一个嵌套对象都会被索引为一个 隐藏的独立文档。
所以当我们用命令GET _cat/indices
查看该index下的数据总数时,会远远大于实际数量,这是因为一个数据被拆成了多个独立文档存储的缘故,所以当我们把mappings中的某些字段改为nested类型时,看到数据倍增不要惊讶哦,用下面这个查询去具体的索引里面才能看到实际的数据条数哦
GET /kol_account_xhs/_search
{
"track_total_hits": true
}
三、MySQL转Elasticsearch
由于ES语法是JSON格式,复杂查询需要写的语句更是千变万化让人头大,我这里给大家推荐一个MySQL语句转ES语句的官方语法,应该能帮大家更好的去学习及灵活运用
POST /_sql/translate
{
"query":"select * from kol_account_weibo1 where username like '%雅诗%' order by fansnum limit 10000"
}
左边为MySQL语句,右边是具体的ES语法
总结
elastic search的功能非常强大,聚合查询,查询高亮等等的功能我就不一一列举了,能应用到的场景也是非常的多,能把这个学好肯定会对你有很大的帮助。
上篇的内容基本上已经结束,下篇就是我们spring boot+elasticsearch的实战,大家加油哦