简介
- 介绍:The Elastic Stack, 包括 Elasticsearch、Kibana、Beats 和 Logstash(也称为 ELK Stack)
- Elasticsearch简称ES,ES 是一个开源的高扩展的分布式全文搜索引擎,是整个 Elastic Stack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。
全文搜索引擎:它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式 - Elasticsearch And Solr:在使用过程中,一般都会将 Elasticsearch 和 Solr 这两个软件对比,然后进行选型。这两个搜索引擎都是流行的,先进的的开源搜索引擎。它们都是围绕核心底层搜索库 - Lucene构建的 - 但它们又是不同的
安装
- 下载 ![官网] (https://www.elastic.co/cn/) ![下载](https://www.elastic.co/cn/downloads/past-releases#elasticsearch) Elasticsearch 分为 Linux 和 Windows 版本
- 安装 windows版本直接在需要安装路径进行解压
2.1. 启动会使用系统配置JDK,即JAVA_HOME 如果没有则使用自带JDK
2.2. 闪退,空间不足需要配置 config/jvm.options文件
# 设置 JVM 初始内存为 1G。此值可以设置与-Xmx 相同,以避免每次垃圾回收完成后 JVM 重新分配内存
# Xms represents the initial size of total heap space
# 设置 JVM 最大可用内存为 1G
# Xmx represents the maximum size of total heap space
-Xms1g
-Xmx1g
- 启动 bin下bat文件启动
基本使用
安装postman
索引操作
- 创建索引 PUT http://127.0.0.1:9200/shopping(重复添加会返回错误)
- 查看所有索引 GET http://127.0.0.1:9200/_cat/indices?v (请求路径中的_cat 表示查看的意思,indices 表示索引)
- 查看单个索引 GET http://127.0.0.1:9200/shopping
{
"shopping"【索引名】: {
"aliases"【别名】: {},
"mappings"【映射】: {},
"settings"【设置】: {
"index"【设置 - 索引】: {
"creation_date"【设置 - 索引 - 创建时间】: "1614265373911",
"number_of_shards"【设置 - 索引 - 主分片数量】: "1",
"number_of_replicas"【设置 - 索引 - 副分片数量】: "1",
"uuid"【设置 - 索引 - 唯一标识】: "eI5wemRERTumxGCc1bAk2A",
"version"【设置 - 索引 - 版本】: {
"created": "7080099"
},
"provided_name"【设置 - 索引 - 名称】: "shopping"
}
}
}
}
- 删除索引 DELETE http://127.0.0.1:9200/shopping
- 创建文档 POST http://127.0.0.1:9200/shopping/_doc(此处发送请求的方式必须为 POST,不能是 PUT,否则会发生错误)(http://127.0.0.1:9200/shopping/_doc/1 创建时指定索引 如果指定主键那么请求方式也可为 PUT)
- 查看文档 GET http://127.0.0.1:9200/shopping/_doc/1
{
"_index"【索引】: "shopping",
"_type"【文档类型】: "_doc",
"_id": "1",
"_version": 2,
"_seq_no": 2,
"_primary_term": 2,
"found"【查询结果】: true, # true 表示查找到,false 表示未查找到
"_source"【文档源信息】: {
"title": "华为手机",
"category": "华为",
"images": "http://www.gulixueyuan.com/hw.jpg",
"price": 4999.00
}
}
- 修改文档 ** POST http://127.0.0.1:9200/shopping/_doc/1**
{
"title":"华为手机",
"category":"华为",
"images":"http://www.gulixueyuan.com/hw.jpg",
"price":4999.00
}
- 修改字段 POST http://127.0.0.1:9200/shopping/_update/1
{
"doc": {
"price":3000.00
}
}
- 删除文档 **删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)DELETE http://127.0.0.1:9200/shopping/_doc/1 **
//响应内容
{
"_index": "shopping",
"_type": "_doc",
"_id": "1",
"_version"【版本】: 4, #对数据的操作,都会更新版本
"result"【结果】: "deleted", # deleted 表示数据被标记为删除
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 4,
"_primary_term": 2
}
//请求
{
"query":{
"match":{
"price":4000.00
}
}
}
映射操作 映射类似数据库中表结构
- 创建映射** PUT http://127.0.0.1:9200/student/_mapping**
{
"properties": {
"name":{
"type": "text",
"index": true
},
"sex":{
"type": "text",
"index": false
},
"age":{
"type": "long",
"index": false
}
}
}
- 查看映射 ** GET http://127.0.0.1:9200/student/_mapping**
- 索引映射关系 ** PUT http://127.0.0.1:9200/student1**
{
"settings": {},
"mappings": {
"properties": {
"name":{
"type": "text",
"index": true
},
"sex":{
"type": "text",
"index": false
},
"age":{
"type": "long",
"index": false
}
}
}
}
//响应
{
"took【查询花费时间,单位毫秒】" : 1116,
"timed_out【是否超时】" : false,
"_shards【分片信息】" : {
"total【总数】" : 1,
"successful【成功】" : 1,
"skipped【忽略】" : 0,
"failed【失败】" : 0
},
"hits【搜索命中结果】" : {
"total"【搜索条件匹配的文档总数】: {
"value"【总命中计数的值】: 3,
"relation"【计数规则】: "eq" # eq 表示计数准确, gte 表示计数不准确
},
"max_score【匹配度分值】" : 1.0,
"hits【命中结果集合】" : [
。。。
}
]
}
}
- 匹配查询 match 匹配类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是 or 的关系 GET http://127.0.0.1:9200/student/_search
// 请求
{
"query": {
"match": {
"name":"zhangsan"
}
}
}
- 字段匹配查询 multi_match 与 match 类似,不同的是它可以在多个字段中查询 GET http://127.0.0.1:9200/student/_search
{
"query": {
"multi_match": {
"query": "zhangsan",
"fields": ["name","nickname"]
}
}
}
- 关键字精确查询 term 查询,精确的关键词匹配查询,不对查询条件进行分词 GET http://127.0.0.1:9200/student/_search
{
"query": {
"term": {
"name": {
"value": "zhangsan"
}
}
}
}
- 多关键字精确查询 terms 查询和 term 查询一样,但它允许你指定多值进行匹配 如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件,类似于 mysql 的 in GET http://127.0.0.1:9200/student/_search
{
"query": {
"terms": {
"name": ["zhangsan","lisi"]
}
}
}
- 指定查询字段 默认情况下,Elasticsearch 在搜索的结果中,会把文档中保存在_source 的所有字段都返回 如果我们只想获取其中的部分字段,我们可以添加_source 的过滤 GET http://127.0.0.1:9200/student/_search
//请求
{
"_source": ["name","nickname"],
"query": {
"terms": {
"nickname": ["zhangsan"]
}
}
}
- 过滤字段 includes:来指定想要显示的字段 excludes:来指定不想要显示的字段 GET http://127.0.0.1:9200/student/_search
//请求
{
"_source": {
"includes": ["name","nickname"]
},
"query": {
"terms": {
"nickname": ["zhangsan"]
}
}
}
//请求2
{
"_source": {
"excludes": ["name","nickname"]
},
"query": {
"terms": {
"nickname": ["zhangsan"]
}
}
}
- 组合查询
bool
把各种其它查询通过must
(必须 )、must_not
(必须不)、should
(应该)的方式进行组合 GET http://127.0.0.1:9200/student/_search
//请求
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "zhangsan"
}
}
],
"must_not": [
{
"match": {
"age": "40"
}
}
],
"should": [
{
"match": {
"sex": "男"
}
}
]
}
}
}
- 范围查询 range 查询找出那些落在指定区间内的数字或者时间。range 查询允许以下字符
|操作符| 说明 |
| ---- | ---- |
| gt | 大于> |
| gte |大于等于>=|
| lt | 小于< |
|lte | 小于等于<= |
{
"query": {
"range": {
"age": {
"gte": 30,
"lte": 35
}
}
}
}
- 模糊查询 **返回包含与搜索字词相似的字词的文档 GET http://127.0.0.1:9200/student/_search **
编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。这些更改可以包括:
更改字符(box → fox)
删除字符(black → lack)
插入字符(sic → sick)
转置字符(act → cat)
{
"query": {
"fuzzy": {
"title": {
"value": "zhangsan"
}
}
}
}
{
"query": {
"fuzzy": {
"title": {
"value": "zhangsan",
"fuzziness": 2
}
}
}
}
- 多字段排序 假定我们想要结合使用 age 和 _score 进行查询,并且匹配的结果首先按照年龄排序,然后
按照相关性得分排序 GET http://127.0.0.1:9200/student/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": {
"order": "desc"
}
},
{
"_score":{
"order": "desc"
}
}
]
}
- 高亮查询 Elasticsearch 可以对查询内容中的关键字部分,进行标签和样式(高亮)的设置
在使用 match 查询的同时,加上一个 highlight 属性:
pre_tags:前置标签
post_tags:后置标签
fields:需要高亮的字段
title:这里声明 title 字段需要高亮,后面可以为这个字段设置特有配置,也可以空
在 Postman 中,向 ES 服务器发 GET http://127.0.0.1:9200/student/_search
{
"query": {
"match": {
"name": "zhangsan"
}
},
"highlight": {
"pre_tags": "<font color='red'>",
"post_tags": "</font>",
"fields": {
"name": {}
}
}
}
- from:当前页的起始索引,默认从 0 开始。 from = (pageNum - 1) * size
- size:每页显示多少条
{
"query": {
"match_all": {}
},
"sort": [
{
"age": {
"order": "desc"
}
}
],
"from": 0,
"size": 2
}
- 聚合查询 取最大值、最小、平均值、去重统计、State 聚合(stats 聚合,对某个字段一次性返回 count,max,min,avg 和 sum 五个指标)等等 GET http://127.0.0.1:9200/student/_search
{
"aggs":{
"stats_age":{
"stats":{"field":"age"}
}
},
"size":0
}
- 桶聚合查询
- 桶聚和相当于 sql 中的 group by 语句
- terms 聚合,分组统计
- ** GET http://127.0.0.1:9200/student/_search**
{
"aggs":{
"age_groupby":{
"terms":{"field":"age"}
}
},
"size":0
}
- 在 terms 分组下再进行聚合
- GET http://127.0.0.1:9200/student/_search
{
"aggs":{
"age_groupby":{
"terms":{"field":"age"}
}
},
"size":0
}