一、ES(ElasticSearch)
ES是一个基于RESTful web接口并且构建在Apache Lucene之上的开源分布式搜索引擎。
它是非关系型数据库
elasticsearch中索引 => mysql 表
elasticsearch中映射 => mysql 表结构
elasticsearch中文档 => mysql 行
elasticsearch中字段 => mysql 列
二、参加聚合的字段都有:
1.keyworld类型(文本字段的一种,用于过滤、排序、聚合和精确值)
2.数值类型(integet和float)
3.日期类型
4.布尔类型(统计true、false的数量)
注意:不能参加聚合的字段主要是text类型,它用于全文检索
三、ES聚合分为:
1.Bucket(桶)聚合:照指定的条件对数据进行分组统计,可以嵌套
2.Metric(指标)聚合:计算指标,max、min、avg、sum等(也称度量聚合:Stats同时求前四个)
3.Pipeline(管道)聚合:对聚合结果的二次聚合
ES聚合三要素:聚合名称、聚合类型、聚合字段
四、案例
1. # 查看所有的索引:GET /_cat/indices
2. # 创建索引:PUT /books
3. # 删除索引:DELETE /books
4. #文档操作
创建文档 添加
POST /books/_doc
{
"title":"一只特立独行的喵",
"type":"纸书",
"cover":"https://img2.doubanio.com/view/subject/s/public/s1670642.jpg",
"price":25.5
}
POST /books/_doc
{
"title":"庆余年",
"type":"电子书",
"cover":"https://img2.doubanio.com/view/subject/s/public/s1670642.jpg",
"price":85.5
}
POST /books/_doc
{
"title":"庆家军",
"type":"纸书",
"cover":"https://img2.doubanio.com/view/subject/s/public/s1670642.jpg",
"price":105.5
}
# 默认文档id是自动生成的 可以自己指定
POST /books/_doc/a1111
{
"title":"三体一:地球往事",
"type":"电子书",
"cover":"https://img2.doubanio.com/view/subject/s/public/s1670642.jpg",
"price":100
}
5. # 查询
# 主键查询
GET /books/_doc/a1111
# 查询所有
GET 形式查询所有: GET /books/_search
POST 形式查询所有:
POST /books/_search
{
"query": {
"match_all": {}
}
}
# 修改
# 全量修改 写死了
POST /books/_doc/a1111
{
"title" : "三体一:地球往事2",
"type":"电子书",
"cover":"https://img2.doubanio.com/view/subject/s/public/s1670642.jpg",
"price":100
}
# 局部修改
POST /books/_update/a1111
{
"doc": {
"title" : "三体一:地球往事"
}
}
# 删除 逻辑删除
DELETE /books/_doc/a1111
# 查询 【搜索】
POST /books/_search
{
"query": {
"match": {
"title": "三体一"
}
}
}
# 全量查询并且指定字段返回
POST /books/_search
{
"query": {
"match_all": {}
},
"_source": ["title", "price"]
}
# 分页查询
# mysql limit
# limit 5 -> 展示前五条数据
# limit offset , 4 offset 跳过几条数据
# limit (pageNum-1)*pageSize, pageSize
# ES 分页
# from: 跳过几条数据
# size: 每页展示多少条
POST /books/_search
{
"query": {
"match_all": {}
},
"from": 2,
"size": 2
}
# 排序
POST /books/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"price": {
"order": "desc"
}
}
]
}
# 查询电子书并且价格为100的
POST /books/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"type": "电子书"
}
},
{
"match": {
"price": "100"
}
}
]
}
}
}
# 多条件范围查询 [数字]
POST /books/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"title": "一"
}
}
],
"filter": [
{
"range": {
"price": {
"gte": 10,
"lte": 100
}
}
}
]
}
}
}
# 完全匹配检索 模糊
POST /books/_search
{
"query": {
"match_phrase": {
"title": "体一"
}
}
}
# 高亮查询
POST /books/_search
{
"query": {
"match": {
"title": "三体一"
}
},
"highlight": {
"fields": {"title": {}},
"pre_tags": ["<span style=\"color:red;\">"],
"post_tags": ["</span>"]
}
}
# 聚合查询
# NAME 指定聚合查询的名称 随意编写
# AGG_TYPE 聚合类型 max min sum avg count ...
POST /books/_search
{
"size": 0,
"aggs": {
"max_price": {
"avg": {
"field": "price"
}
}
}
}
POST /books/_search
{
"size": 0,
"aggs": {
"price_count": {
"terms": {
"field": "price"
}
}
}
}
# 创建 商品索引的 映射
PUT /goods
{
"mappings": {
"properties": {
"goodsName": {
"type": "text"
},
"price": {
"type": "double",
"index": false
},
"type": {
"type": "keyword"
}
}
}
}
GET /goods/_search
POST /goods/_doc
{
"goodsName": "华为手机",
"price": 1888.88,
"type": "电子产品"
}
POST /goods/_doc
{
"goodsName": "华为手机",
"price": 1888.88,
"type": "电子产品",
"age": 10
}
POST /goods/_search
{
"query": {
"match": {
"type": "电子产品"
}
}
}
五、创建映射
PUT /goods
{
"mappings": {
"properties": {
"goodsName": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"goodsNum": {
"type": "integer"
},
"goodsTime": {
"type": "long"
},
"goodsPrice": {
"type": "double"
},
"goodsStatus":{
"type": "integer"
},
"goodsPhoto":{
"type": "keyword"
},
"typeId": {
"type": "integer"
},
"typeName": {
"type": "keyword",
"index": false
},
"createBy":{
"type": "long"
}
}
}
}