Elasticsearch 基础

本贴最后更新于 640 天前,其中的信息可能已经时移世易

Elasticsearch

1. 安装

安装链接

  • 点击链接安装,然后解压即可

2. 基础语法

2.1 索引

  • 创建 students 索引: put: host/students
  • 查看单个索引:get: host/students
{
    "shopping": {//索引名
        "aliases": {},//别名
        "mappings": {},//映射
        "settings": {//设置
            "index": {//设置 - 索引
                "creation_date": "1617861426847",//设置 - 索引 - 创建时间
                "number_of_shards": "1",//设置 - 索引 - 主分片数量
                "number_of_replicas": "1",//设置 - 索引 - 主分片数量
                "uuid": "J0WlEhh4R7aDrfIc3AkwWQ",//设置 - 索引 - 主分片数量
                "version": {//设置 - 索引 - 主分片数量
                    "created": "7080099"
                },
                "provided_name": "shopping"//设置 - 索引 - 主分片数量
            }
        }
    }
}

  • 查询全部的索引,以及索引的状态信息:get: host/_cat/indices?v

image-20220627165849192

表头 含义
health 当前服务器健康状态: green(集群完整) yellow(单点正常、集群不完整) red(单点不正常)
status 索引打开、关闭状态
index 索引名
uuid 索引统一编号
pri 主分片数量
rep 副本数量
docs.count 可用文档数量
docs.deleted 文档删除状态(逻辑删除)
store.size 主分片和副分片整体占空间大小
pri.store.size 主分片占空间大小
  • 删除索引:``DELETE: host/studets`

2.2 文档

  • 创建文档(不指定主键,他会自己生成一个主键 _id):POST : host/shop/_doc 请求的 JSON 格式为:
{
    "shop_name": "西瓜",
    "price": 20
}
  • 创建文档(指定主键):POST/PUT : host/shop/_doc/1 请求的 JSON 格式同上.

2.3 查询

  • 主键查询:GET: host/shop/_doc/1
  • 查看所有数据:GET: host/shop/_search

2.3.1 条件查询

  • URL 带参查询方式:GET host/shop/_search?q=shop_name:西瓜 格式是后面有个 q 参数,然后里面加上条件,多条件的时候使用 AND 或者 OR 连接

  • 我们主要使用的是 请求体带参查询 同样是 GET 请求,但是需要有 json 体

    • 单条件查询使用 "match";(多条件详见 bool 查询)
    {
        "query":
        {
            "match":
            {
                "shop_name":"西瓜"
            }
        }
    }
    
    • 查询所有文档内容用 "match_all"
    {
        "query":
        {
            "match_all":{}
        }
    }
    
    • 指定查询的字段使用 _source:[]
    {
        "query":
        {
            "match_all":{}
        }
        "_source":["shop_name":"西瓜","price":20]
    }
    

2.3.2 分页查询

使用 from 和 size 进行分页查询

{
	"query":{
		"match_all":{}
	},
	"from":0,
	"size":2
}

2.3.3 查询排序

{
	"query":{
		"match_all":{}
	},
	"sort":{
		"price":{
			"order":"desc"
		}
	}
}

2.3.4 bool 查询

must:与关系,相当于关系型数据库中的 and。

should:或关系,相当于关系型数据库中的 or。

must_not:非关系,相当于关系型数据库中的 not。

filter:过滤条件。

range:条件筛选范围。

多条件查询
  • 多条件查询 must 相当于数据库的&& should 相当于数据库的 ||
{
	"query":{
		"bool":{
			"must(should)":[{
				"match":{
					"shop_name":"西瓜"
				}
			},{
				"match":{
					"price":20
				}
			}]
		}
	}
}
范围查询
  • gt: > 大于(greater than)

  • lt: < 小于(less than)

  • gte: >= 大于或等于(greater than or equal to)

  • lte: <= 小于或等于(less than or equal to)

    {
        "query":
        {
            "bool":
            {
                "should":
                {
                    "match":
                    {
                        "shop_name":西瓜
                    }
                }
            },
            "filter":
            {
                "range":
                {
                    "gt":10
                }
            }
        }
    }
    

2.3.5 全文检索

  • 全文检索比较强,我输入“西南”,他能返回西瓜和南瓜,只要是我查询的字段包含这里面的字的时候他都返回
{
    "query":
    {
        "match":
        {
            "shop_name":"西南"
        }
    }
}

2.3.6 完全匹配(模糊查询)

跟全文检索不同的是全文检索使用的是 match 而 完全匹配使用的是 match_phrase

{
	"query":
    {
        "match_phrase":
        {
            "shop_name":"西南"
        }
    }
}

2.3.7 高亮查询

使用 highlight 来进行处理

{
	"query":
    {
        "match":
        {
            "shop_name":"西南"
        }
    },
    "highlight":
    {
        "fields":
        {
            "shop_name":{}
        }

    }
}

2.3.8 聚合查询

聚合查询使用的是 aggs

  • 分组操作

    {
        "aggs":
        {
            "price_group": //名字随便起,分组的名字
            {
                "terms"://分组操作
                {
                    "field":"price" //要分组的字段
                }
            }
        },
        "size":0 //不加这个他会先显示所有数据,再显示分组的
    }
    
  • 求平均值操作:跟上面同理,只是 terms 操作变成了 avg 操作

    {
        "aggs":
        {
            "price_avg": //名字随便起,分组的名字
            {
                "avg":
                {
                    "field":"price" //要分组的字段
                }
            }
        },
        "size":0 //不加这个他会先显示所有数据,再显示分组的
    }
    

2.4 修改操作

  • 全局修改:POST: host/shop/_doc/1 请求的 json 格式为
{
    “name” : "黄瓜",
    "price": 30,
    "weight":20
}
  • 局部修改:POST: host/shop/_update/1 请求的 json 格式为
{
    "doc":{
        "name" : "南瓜"
    }
}
  • 删除一个文档:DELETE: host/shop/_doc/1,删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)。
{
    "_index": "shop",
    "_type": "_doc",
    "_id": "1",
    "_version": 4,
    "result": "deleted", ------标记删除成功
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 4,
    "_primary_term": 1
}

2.5 映射

  • 创建一个新的索引

  • 发送映射请求:PUT:/host/user/_mapping

    {
        "properties":{
            "name":{
                "type":"text", //这个类型可以全文检索
                "index":true
            },
            "sex":{
                 "type":"keyword", //这个类型不能全文检索
                 "index":true
            }
        }
    }
    
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    116 引用 • 99 回帖 • 275 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...