1.Elasticsearch介绍

内容拷贝:https://blog.csdn.net/jiayoubaobei2/article/details/125882986

1. Elasticsearch概述 1.1 开篇 1.1.1 结构化数据

1.Elasticsearch介绍
老师说扩展结构不方便,我也没明白哪里不方便,很方便啊,想增加字段就增加,想删除就删除,如果哪位大佬知道麻烦底下留言指教

1.1.2 非结构化数据

1.Elasticsearch介绍
无法用二维表结构来表现数据的数据,比如服务器日志,无法用结构表现,通信记录,视频或者图片,维度广数据量大,数据的查询和存储的成本非常大,往往需要专业的人员的大量的统计模型进行处理,一般这种数据保存到nosql数据库中,如redis,通过key来查询我们数据

1.1.3 半结构化数据

1.Elasticsearch介绍
将数据的结构和内容混在一起,没有明显的区分,像xml和html,这样的文档就是半结构化数据,也是一般保存到nosql中,缺点就是查询内容不是很容易

1.3 Elasticsearch是什么

1.3.1 介绍

The Elastic Stack,包括Elasticsearch、Kibana用于展示数据的项目、Beats和Logstash采集和传输数据的项目(也称为ELK stack)

Elaticsearch,简称为 ES, ES 是一个 开源的高扩展的分布式全文搜索引擎, 也可以理解为全栈搜索,比如说在博客网站中,用户在网站里写一些文章,其他用户可以根据热门词汇或者关键字等等,进行搜索,查询整个网站所有匹配的文章,并以列表的形式展现出来,传统数据库以这样的方式检索效率是非常低的,即使进行sql索引优化,效果也不会很明显,所以生产环境中,这种常规搜索方式效果比较差,是整个 ElasticStack 技术栈的核心,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据

1.3.2 全文搜索引擎

Google,百度类的网站搜索,它们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,它们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中应用日志的搜索等等。对于这些非结构化的数据文本,关系型数据库搜索不是能很好的支持。

一般传统数据库,全文检索都实现的很鸡肋,因为一般也没人用数据库存文本字段。进行全文检索需要扫描整个表,如果数据量大的话即使对 SQL 的语法优化,也收效甚微。建立了索引,但是维护起来也很麻烦,对于 insert 和 update 操作都会重新构建索引。

基于以上原因可以分析得出,在一些生产环境中,使用常规的搜索方式,性能是非常差的

1.搜索的数据对象是大量的非结构化的文本数据。
2.文件记录量达到数十万或数百万个甚至更多。
3.支持大量基于交互式文本的查询。
4.需求非常灵活的全文搜索查询。
5.对高度相关的搜索结果的有特殊需求,但是没有可用的关系数据库可以满足。
6.对不同记录类型、非文本数据操作或安全事务处理的需求相对较少的情况。为了解决结构化数据搜索和非结构化数据搜索性能问题,我们就需要专业,健壮,强大的全文搜索引擎

这里说到的全文搜索引擎指的是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程

2. Elasticsearch入门

2.1 环境准备

Windows 版的 Elasticsearch 压缩包,解压即安装完毕,解压后的 Elasticsearch 的目录结构如下 :

目录 含义 bin 可执行脚本目录 config 配置目录 jdk 内置 JDK 目录 lib 类库 logs 日志目录 modules 模块目录 plugins 插件目录

解压后,进入 bin 文件目录,点击 elasticsearch.bat 文件启动 ES 服务 。

注意: 9300 端口为 Elasticsearch 集群间组件的通信端口, 9200 端口为浏览器访问的 http协议 RESTful 端口。

打开浏览器,输入地址: http://localhost:9200,测试返回结果

{
  "name" : "LAPTOP-SNNQ1UNH",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "swFLKvuqRBOE0r5GewiUwg",
  "version" : {
    "number" : "7.14.1",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "66b55ebfa59c92c15db3f69a335d500018b3331e",
    "build_date" : "2021-08-26T09:01:05.390870785Z",
    "build_snapshot" : false,
    "lucene_version" : "8.9.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

1.Elasticsearch介绍

2.2 名词解释

2.2.1 Restful & Json

互联网软件的架构原则,这个原则我们称之为rest原则,表示资源状态转换,就是说我们请求的资源是有状态的,而这些状态会根据原则改变和转换,其实我们Http协议就遵循了rest原则,比如在web中资源的唯一标识是URI,叫统一资源路径,我们可以在浏览器输入这个路径,来定位网上的资源,比如http://localhost:9200/test/test.txt,这个路径不应该包含对资源的操作的,比如增加修改,路径是不应该存在的,那rest风格当中就要我们统一遵循接口原则,统一接口就包含了受限制的预定义的操作,无论什么样的资源都应该用同样的接口对资源进行访问,这里的接口就应该符合标准的http的方法,比方说, get,post,put,delete,heade,我们的路径是对资源的定位,方法是对资源的操作,按照http的方法就会暴露我们的资源,我们接口就具有安全性和幂等性的特性,比如get和head的请求都是安全的,无论你请求多少次都不会改变服务器资源的状态,而put,delete这些请求都是幂等性的,无论对资源操作多少次结果都是一样的,后面的请求并不会对第一次请求产生更多的影响,你put插入的东西永远是相同的,post不是幂等性的,当我们用rest风格想es发出请求之后,es就会返回响应,返回响应的数据格式为json,es数据的发送和返回都是以json为标准格式的

2.2.2 数据格式

Elasticsearch 是 面向文档型数据库,一条数据在这里就是一个文档。 为了方便大家理解,我们将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比

1.Elasticsearch介绍

ES 里的 Index 可以看做一个库,而 Types 相当于表, Documents 则相当于表的行。这里 Types 的概念已经被逐渐弱化, Elasticsearch 6.X 中,一个 index 下已经只能包含一个type, Elasticsearch 7.X 中, Type 的概念已经被删除了

理解:在关系型数据库中索引是为了优化查询所设计的数据库对象,没有索引也能查询就是慢,而ES软件专门用于全文检索数据,所以索引是搜索引擎的关键,甚至可以说万物皆索引不为过,es为了能够做到快速准确查询,使用特殊概念进行数据的存储和查询,这个概念称之为 倒排索引,我们可以根据主键查询对应信息,通过建立主键索引快速查出对应信息,这种叫 正向索引,如果我们想要查询文章内容中,包含了哪些热门词汇,我们需要做模糊查询,这个查询效率很差,而且每条数据都需要遍历,而且查询内容的大小写,时态都会影响查询的准确率,如果你想查大写,数据中有小写的你查不查,算不算匹配,所以这个时候就需要换一种方式,将数据和索引关联,就需要倒排索引,通过关键字查询主键id,然后再关联文章内容,不会体现表的概念,如果模糊查询的话,他会告诉你,数据在哪张表里面,具体规则是什么,倒排索引中强调的是关键字和文档编号的关联,表的作用没有那么关键了,所以说type概念逐渐弱化,其他的概念还是跟数据库相对应的

1.Elasticsearch介绍
  1. ES操作

3.1 索引操作

3.1.1 创建索引

对比关系型数据库,创建索引就等同于创建数据库,索引是必要的

在 Postman 中,向 ES 服务器发 PUT 请求 : http://127.0.0.1:9200/shopping,127.0.0.1:9200表示ES软件,shopping表示索引名称,注意请求方法

请求后,服务器返回响应:

{
    "acknowledged": true,//表示响应成功
    "shards_acknowledged": true,
    "index": "shopping"
}

如果你再一次发送请求,put请求具有幂等性,你只要发出同样的请求,结果是一样的,表示你刚刚创建成功了吧,你再去创建就会有问题

如果重复发 PUT 请求 : http://127.0.0.1:9200/shopping 添加索引,会返回错误信息 :

{
    "error": {
        "root_cause": [
            {
                "type": "resource_already_exists_exception",
                "reason": "index [shopping/J0WlEhh4R7aDrfIc3AkwWQ] already exists",
                "index_uuid": "J0WlEhh4R7aDrfIc3AkwWQ",
                "index": "shopping"
            }
        ],
        "type": "resource_already_exists_exception",
        "reason": "index [shopping/J0WlEhh4R7aDrfIc3AkwWQ] already exists",
        "index_uuid": "J0WlEhh4R7aDrfIc3AkwWQ",
        "index": "shopping"
    },
    "status": 400
}

1.Elasticsearch介绍

3.1.2 索引-查询

查询指定索引信息 http://127.0.0.1:9200/shopping get请求,结果

{
    "shopping": {
        "aliases": {},
        "mappings": {},
        "settings": {
            "index": {
                "routing": {
                    "allocation": {
                        "include": {
                            "_tier_preference": "data_content"
                        }
                    }
                },
                "number_of_shards": "1",
                "provided_name": "shopping",
                "creation_date": "1658549559292",
                "number_of_replicas": "1",
                "uuid": "0FEhzMkRSeSvqp_HD1jXpg",
                "version": {
                    "created": "7170399"
                }
            }
        }
    }
}
返回的是shopping索引的详细信息

如何查看所有索引呢? http://127.0.0.1:9200/_cat/indices?v 查看所有的索引,?v查看详细信息,_cat查询的意思

health status index    uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   shopping J0WlEhh4R7aDrfIc3AkwWQ   1   1          0            0       208b           208b

1.Elasticsearch介绍

3.1.3 删除索引

在 Postman 中,向 ES 服务器发 DELETE请求 : http://127.0.0.1:9200/shopping

返回结果如下:


{
    "acknowledged": true
}

再次查看所有索引,GET http://127.0.0.1:9200/_cat/indices?v,返回结果如下:成功删除,没有任何索引的相关信息

health status index uuid pri rep docs.count docs.deleted store.size pri.store.size

发送:localhost:9200/shopping get请求

1.Elasticsearch介绍

3.2 文档操作

3.2.1 创建文档

假设索引已经创建好了,接下来我们来创建文档,并添加数据。这里的文档可以类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式

在 Postman 中,向 ES 服务器发 POST请求 : http://127.0.0.1:9200/shopping/_doc,前面是地址和索引的名称,_doc索引中添加文档数据的意思,添加数据就表示添加文档,需要请求体,请求体JSON内容为

{
    "title":"小米手机",
    "category":"小米",
    "images":"http://www.gulixueyuan.com/xm.jpg",
    "price":3999.00
}

1.Elasticsearch介绍

注意:请求路径为:http://127.0.0.1:9200/shopping/_doc

此处发送请求的方式必须为 POST,不能是 PUT,否则会发生错误

返回结果:同样的请求,post多次发出,得到的 _id是不同的,说明这个操作不是幂等性的,可是put操作是 幂等性的,所以put请求是不行的

{
    "_index": "shopping",//索引
    "_type": "_doc",//类型-文档
    "_id": "ANQqsHgBaKNfVnMbhZYU",//唯一标识,可以类比为 MySQL 中的主键,es随机生成
    "_version": 1,//版本
    "result": "created",//结果,这里的 create 表示创建成功
    "_shards": {//
        "total": 2,//分片 - 总数
        "successful": 1,//分片 - 总数
        "failed": 0//分片 - 总数
    },
    "_seq_no": 0,
    "_primary_term": 1

}

如果想要自定义唯一性标识,需要在创建时指定: http://127.0.0.1:9200/shopping/_doc/ 1001,后面跟自己的自定义标识,得到的返回结果:

{
    "_index": "shopping",
    "_type": "_doc",//文本类型
    "_id": "1001",//返回的是自定义id
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 1,
    "_primary_term": 1
}

此处需要注意:如果增加数据时明确数据主键,那么请求方式也可以为 PUT

使用这个路径也可以:

http://127.0.0.1:9200/shopping/ _create/1001 也是可以的(不适用 _doc,使用 _create)

但是这个只能用一次,第二次就会报已存在,除非更改id值

1.Elasticsearch介绍

3.2.2 主键查询

查看文档时,需要指明文档的 唯一性标识,类似于 MySQL 中数据的主键查询

在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_doc/1001

返回结果如下:。

{
    "_index": "shopping",
    "_type": "_doc",
    "_id": "1001",
    "_version": 1,
    "_seq_no": 1,
    "_primary_term": 1,
    "found": true,//查询到数据
    "_source": { //数据结果
        "title": "小米手机",
        "category": "小米",
        "images": "http://www.gulixueyuan.com/xm.jpg",
        "price": 3999.00
    }
}

查找不存在的内容,向 ES 服务器发 GET 请求 : http://127.0.0.1:9200/shopping/_doc/1

返回结果如下:

{
    "_index": "shopping",
    "_type": "_doc",
    "_id": "1001",
    "found": false//返回false,说明不存在
}

3.2.3 查询索引下所有文档

查看索引下所有id的数据,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/ _search

返回结果如下:

{
    "took": 7,  //耗费事件
    "timed_out": false, //是否超时
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {  //命中结果
        "total": {
            "value": 2,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "shopping",
                "_type": "_doc",
                "_id": "dRMBKoIB6nXwiib44SNN",
                "_score": 1.0,
                "_source": {
                    "title": "小米手机",
                    "category": "小米",
                    "images": "http://www.gulixueyuan.com/xm.jpg",
                    "price": 3999.00
                }
            },
            {
                "_index": "shopping",
                "_type": "_doc",
                "_id": "1001",
                "_score": 1.0,
                "_source": {
                    "title": "小米手机",
                    "category": "小米",
                    "images": "http://www.gulixueyuan.com/xm.jpg",
                    "price": 3999.00
                }
            }
        ]
    }
}

3.2.4 文档修改

完全覆盖

和新增文档一样,输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖

在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_doc/1001

请求体JSON内容为:


{
    "title":"华为手机",
    "category":"华为",
    "images":"http://www.gulixueyuan.com/hw.jpg",
    "price":1999.00
}

修改成功后,服务器响应结果:

{
    "_index": "shopping",
    "_type": "_doc",
    "_id": "1001",
    "_version": 2,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 2,
    "_primary_term": 1
}

1.Elasticsearch介绍

1.Elasticsearch介绍

局部修改

修改数据时,也可以只修改某一给条数据的局部信息

在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/ _update/1001

请求体JSON内容为:


{
    "doc": { //数据的意思
        "title":"华为手机", //花括号里是写想对谁进行修改
        "category":"华为"
    }
}

返回结果如下:

{
    "_index": "shopping",
    "_type": "_doc",
    "_id": "1001",
    "_version": 2,
    "result": "noop",
    "_shards": {
        "total": 0,
        "successful": 0,
        "failed": 0
    },
    "_seq_no": 2,
    "_primary_term": 1
}

在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_doc/1,查看修改内容:

{
    "_index": "shopping",
    "_type": "_doc",
    "_id": "1001",
    "_version": 2,
    "_seq_no": 2,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "title": "华为手机",
        "category": "华为",
        "images": "http://www.gulixueyuan.com/hw.jpg",
        "price": 1999.00
    }
}

3.2.5 删除文档

删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)。

在 Postman 中,向 ES 服务器发 DELETE请求 : http://127.0.0.1:9200/shopping/_doc/1001

{
    "_index": "shopping",
    "_type": "_doc",
    "_id": "1001",
    "_version": 3,
    "result": "deleted",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 3,
    "_primary_term": 1
}

1.Elasticsearch介绍

在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_doc/1001,查看是否删除成功:

{
    "_index": "shopping",
    "_type": "_doc",
    "_id": "1001",
    "found": false
}

3.2.6 条件查询

查找category为小米的文档,在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search?q=category:小米,这个q就是查询的意思,返回结果如下:

{
    "took": 37,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.5753642,
        "hits": [
            {
                "_index": "shopping",
                "_type": "_doc",
                "_id": "dRMBKoIB6nXwiib44SNN",
                "_score": 0.5753642,
                "_source": {
                    "title": "小米手机",
                    "category": "小米",
                    "images": "http://www.gulixueyuan.com/xm.jpg",
                    "price": 3999.00
                }
            }
        ]
    }
}

我们发现我们的请求路径比较麻烦,而且中文比较容易乱码,一般会通过请求体来传递参数

接下带JSON请求体,还是 查找category为小米的文档,在 Postman 中,向 ES 服务器发 post请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

{
    "query":{
        "match":{
            "category":"小米"
        }
    }
}

1.Elasticsearch介绍

注意如果你用小,或者米进行查询,也可以查到对应数据,因为es采用倒排索引,所有的文字都建立了索引,你用小华,作为条件进行查询,将小米和华为都能查询来,这两个都满足条件,你看是两个文字,他在底层一个一个拆解变成关键词,进行倒排索引的匹配,匹配成功就把数据查询出来

如果想要完全匹配,就需要将match改为match_phrase

全部查询


{
    "query":{
        "match_all":{}
    }
}

1.Elasticsearch介绍

3.2.7 分页查询

在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下

{
    "query":{
        "match_all":{}
    },
    "from":0,  //(页码-1)*每页数量
    "size":2
}

1.Elasticsearch介绍

如何需要查询特定列:

更改请求体为:

{
    "query":{
        "match_all":{}
    },
    "from":0,
    "size":3,
    重点1:加入_source,放入需要查询的字段
    "_source":["title", "price"]
}

1.Elasticsearch介绍

3.2.8 顺序查询

如果你想通过排序查出价格最高的手机,在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下

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

1.Elasticsearch介绍

3.2.10 多条件查询

同时成立

bool表示条件的意思,就是要添加多个条件,多个条件同时成立用 must,多个条件用[]表示

假设想找出小米牌子,价格为3999元的。在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

类似于数据库的and

{
    "query":{
        "bool":{
            "must":[{
                "match":{
                    "category":"小米"
                }
            },{
                "match":{
                    "price":3999.00
                }
            }]
        }
    }
}

不同时成立

用should,表示符合哪个条件都可以,类似于数据库的or,会查询出小米和华为的手机

{
    "query":{
        "bool":{
            "should":[{
                "match":{
                    "category":"小米"
                }
            },{
                "match":{
                    "category":"华为"
                }
            }]
        }
    }
}

3.2.11 范围查询

假设想找出小米和华为的牌子,价格大于2000元的手机。

在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:使用 filter range表示范围

{
    "query":{
        "bool":{
            "should":[{
                "match":{
                    "category":"小米"
                }
            },{
                "match":{
                    "category":"华为"
                }
            }],
            "filter":{
                "range":{
                    "price":{
                        "gt":2000
                    }
                }
            }
        }
    }
}

3.2.12 高亮显示

就像百度一样,搜索的关键字可以高亮显示,所谓高亮就是加上样式设定

在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

{
    "query":{
        "match_phrase":{
            "category" : "为"
        }
    },
    "highlight":{
        "fields":{ // 哪些字段需要高亮
            "category":{}//<----高亮这字段 } }< code></----高亮这字段>

返回报文:

{
    "took": 61,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 1.2039728,
        "hits": [
            {
                "_index": "shopping",
                "_type": "_doc",
                "_id": "1001",
                "_score": 1.2039728,
                "_source": {
                    "title": "&#x534E;&#x4E3A;&#x624B;&#x673A;",
                    "category": "&#x534E;&#x4E3A;",
                    "images": "http://www.gulixueyuan.com/hw.jpg",
                    "price": 4999
                },
                "highlight": {
                    "category": [
                        "&#x534E;<em>&#x4E3A;</em>"
                    ]
                }
            }
        ]
    }
}

1.Elasticsearch介绍

3.2.13 聚合操作
聚合允许使用者对 es 文档进行统计分析,类似与关系型数据库中的 group by,当然还有很多其他的聚合,例如取最大值max、平均值avg等等。接下来按price字段进行分组:

在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体

{
    "aggs":{//&#x805A;&#x5408;&#x64CD;&#x4F5C;
        "price_group":{//&#x540D;&#x79F0;&#xFF0C;&#x968F;&#x610F;&#x8D77;&#x540D;
            "terms":{//&#x5206;&#x7EC4;
                "field":"price"//&#x5206;&#x7EC4;&#x5B57;&#x6BB5;
            }
        }
    }
}

返回结果:

{
    "took": 63,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 6,
            "relation": "eq"
        },
        "max_score": 1,
        "hits": [
            {
                "_index": "shopping",
                "_type": "_doc",
                "_id": "ANQqsHgBaKNfVnMbhZYU",
                "_score": 1,
                "_source": {
                    "title": "&#x5C0F;&#x7C73;&#x624B;&#x673A;",
                    "category": "&#x5C0F;&#x7C73;",
                    "images": "http://www.gulixueyuan.com/xm.jpg",
                    "price": 3999
                }
            },
            {
                "_index": "shopping",
                "_type": "_doc",
                "_id": "A9R5sHgBaKNfVnMb25Ya",
                "_score": 1,
                "_source": {
                    "title": "&#x5C0F;&#x7C73;&#x624B;&#x673A;",
                    "category": "&#x5C0F;&#x7C73;",
                    "images": "http://www.gulixueyuan.com/xm.jpg",
                    "price": 1999
                }
            },
            {
                "_index": "shopping",
                "_type": "_doc",
                "_id": "BNR5sHgBaKNfVnMb7pal",
                "_score": 1,
                "_source": {
                    "title": "&#x5C0F;&#x7C73;&#x624B;&#x673A;",
                    "category": "&#x5C0F;&#x7C73;",
                    "images": "http://www.gulixueyuan.com/xm.jpg",
                    "price": 1999
                }
            },
            {
                "_index": "shopping",
                "_type": "_doc",
                "_id": "BtR6sHgBaKNfVnMbX5Y5",
                "_score": 1,
                "_source": {
                    "title": "&#x534E;&#x4E3A;&#x624B;&#x673A;",
                    "category": "&#x534E;&#x4E3A;",
                    "images": "http://www.gulixueyuan.com/xm.jpg",
                    "price": 1999
                }
            },
            {
                "_index": "shopping",
                "_type": "_doc",
                "_id": "B9R6sHgBaKNfVnMbZpZ6",
                "_score": 1,
                "_source": {
                    "title": "&#x534E;&#x4E3A;&#x624B;&#x673A;",
                    "category": "&#x534E;&#x4E3A;",
                    "images": "http://www.gulixueyuan.com/xm.jpg",
                    "price": 1999
                }
            },
            {
                "_index": "shopping",
                "_type": "_doc",
                "_id": "CdR7sHgBaKNfVnMbsJb9",
                "_score": 1,
                "_source": {
                    "title": "&#x534E;&#x4E3A;&#x624B;&#x673A;",
                    "category": "&#x534E;&#x4E3A;",
                    "images": "http://www.gulixueyuan.com/xm.jpg",
                    "price": 1999
                }
            }
        ]
    },
    "aggregations": {
        "price_group": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": 1999,
                    "doc_count": 5
                },
                {
                    "key": 3999,
                    "doc_count": 1
                }
            ]
        }
    }
}

上面返回结果会附带原始数据的。若不想要不附带原始数据的结果,在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下

{
    "aggs":{
        "price_group":{
            "terms":{
                "field":"price"
            }
        }
    },
    "size":0
}

返回结果:

{
    "took": 60,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 6,
            "relation": "eq"
        },
        "max_score": null,
        "hits": []
    },
    "aggregations": {
        "price_group": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": 1999,
                    "doc_count": 5
                },
                {
                    "key": 3999,
                    "doc_count": 1
                }
            ]
        }
    }
}

3.2.14 平均值

若想对所有手机价格求 平均值

在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:也是不带原始数据

{
    "aggs":{
        "price_avg":{//&#x540D;&#x79F0;&#xFF0C;&#x968F;&#x610F;&#x8D77;&#x540D;
            "avg":{//&#x6C42;&#x5E73;&#x5747;
                "field":"price"
            }
        }
    },
    "size":0
}

3.2.15 映射关系 有了索引库,等于有了数据库中的 database。

接下来就需要建索引库(index)中的映射了,类似于数据库(database)中的表结构(table)。

创建数据库表需要设置字段名称,类型,长度,约束等;索引库也一样,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)

先创建一个索引:

PUT http://127.0.0.1:9200/user

创建映射

PUT http://127.0.0.1:9200/user/_mapping

{
    "properties": { //&#x544A;&#x8BC9;&#x6570;&#x636E;&#x600E;&#x4E48;&#x89C4;&#x5B9A;&#x548C;&#x7EA6;&#x675F;
        "name":{//&#x7D22;&#x5F15;&#x5177;&#x5907;&#x54EA;&#x4E9B;&#x5B57;&#x6BB5;&#xFF0C;&#x6BD4;&#x5982;&#x540D;&#x79F0;
            "type": "text",//&#x7C7B;&#x578B;&#x8D77;&#x540D;&#x53EB;&#x505A;&#x6587;&#x672C;&#xFF0C;&#x53EF;&#x4EE5;&#x5206;&#x8BCD;&#x5339;&#x914D;&#x7684;(&#x6587;&#x672C;&#x90E8;&#x5206;&#x5339;&#x914D;&#x4E5F;&#x4F1A;&#x88AB;&#x67E5;&#x51FA;)
            "index": true//&#x8FD9;&#x4E2A;&#x5B57;&#x6BB5;&#x53EF;&#x4EE5;&#x7D22;&#x5F15;&#x67E5;&#x8BE2;&#x7684;
        },
        "sex":{ //&#x6027;&#x522B;&#xFF0C;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;&#x7D22;&#x5F15;&#x662F;user&#xFF0C;&#x8FD9;&#x4E2A;user&#x5177;&#x5907;&#x7684;&#x5B57;&#x6BB5;
            "type": "keyword",//&#x4EE3;&#x8868;&#x8BE5;&#x5B57;&#x6BB5;&#x662F;&#x5173;&#x952E;&#x5B57;&#x67E5;&#x8BE2;&#xFF0C;&#x5FC5;&#x987B;&#x5B8C;&#x6574;&#x5339;&#x914D;&#xFF0C;&#x90E8;&#x5206;&#x5339;&#x914D;&#x67E5;&#x8BE2;&#x4E0D;&#x51FA;
            "index": true//&#x8FD9;&#x4E2A;&#x5B57;&#x6BB5;&#x53EF;&#x4EE5;&#x7D22;&#x5F15;&#x67E5;&#x8BE2;
        },
        "tel":{
            "type": "keyword",//&#x8868;&#x793A;&#x4E0D;&#x80FD;&#x5206;&#x8BCD;&#xFF0C;&#x53EA;&#x80FD;&#x5B8C;&#x6574;&#x5339;&#x914D;
            "index": false//&#x4EE3;&#x8868;&#x8BE5;&#x5B57;&#x6BB5;&#x6CA1;&#x6709;&#x7D22;&#x5F15;&#xFF0C;&#x4E0D;&#x80FD;&#x7D22;&#x5F15;&#x67E5;&#x8BE2;
        }
    }
}

查询映射

#GET http://127.0.0.1:9200/user/_mapping

返回结果如下:

{
    "user": {
        "mappings": {
            "properties": {
                "name": {
                    "type": "text"
                },
                "sex": {
                    "type": "keyword"
                },
                "tel": {
                    "type": "keyword",
                    "index": false
                }
            }
        }
    }
}

增加数据,类似于数据库往表中增加数据

#PUT http://127.0.0.1:9200/user/_create/1001
{
    "name":"&#x5C0F;&#x7C73;",
    "sex":"&#x7537;&#x7684;",
    "tel":"1111"
}

返回结果如下:

{
    "_index": "user",
    "_type": "_doc",
    "_id": "1001",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}

name是可以分词的,sex是必须完全匹配,tel不能被索引,不能被查询

1.name分词匹配

1.Elasticsearch介绍

2.sex必须完全匹配:

1.Elasticsearch介绍

3.tel不能索引查询

1.Elasticsearch介绍

Original: https://www.cnblogs.com/wmd-l/p/16622561.html
Author: 努力的达子
Title: 1.Elasticsearch介绍

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570098/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JAVA 上加密算法的实现用例

    MD5/SHA1,DSA,DESede/DES,Diffie-Hellman 的使用 单钥密码体制是一种传统的加密算法,是指信息的发送方和接收方共同使用同一把密钥进行加解密。 通常…

    Java 2023年5月29日
    093
  • 替代 Hystrix,Spring Cloud Alibaba Sentinel 快速入门

    提起 Spring Cloud 的限流降级组件,一般首先想到的是 Netflix 的 Hystrix。 不过就在2018年底,Netflix 宣布不再积极开发 Hystrix,该项…

    Java 2023年5月30日
    0110
  • 商城秒杀系统总结(Java)

    本文写的较为零散,对没有基础的同学不太友好。 一、秒杀系统项目总结(基础版) classpath 在.properties中时常需要读取资源,定位文件地址时经常用到 classpa…

    Java 2023年6月7日
    0118
  • rocketmq有序消息

    RocketMQ提供的顺序消费消息实现是使用的FIFO 先进先出算法 Producer消息发送 public class Producer { public static void…

    Java 2023年6月16日
    068
  • TypeScript(4)接口

    介绍 TypeScript 的核心原则之一是对值所具有的结构进行 &#x7C7B;&#x578B;&#x68C0;&#x67E5;。我们使用接口(I…

    Java 2023年6月9日
    087
  • 中小企业的福音来咯!JNPF渐火,助力业务数字化升级

    引言 随着大数据时代的到来,企业业务数字管理越来越受到企业管理人员的重视。而企业如果想要实现数字化管理的话,就需要有拥有一套能够将各环节业务相串联起来的数字化平台应用系统。以此实现…

    Java 2023年6月5日
    081
  • SpringBoot入门

    SpringBoot入门 环境准备: 1、JDK1.8以上 http://www.oracle.com/technetwork/java/javase/downloads/inde…

    Java 2023年5月30日
    066
  • SpringCloud : yml文件配置 获取系统环境变量的值

    注意,这里说的是获取系统环境变量的值,譬如Windows里配置的JAVA_HOME之类的,可以直接在Springboot的配置文件中获取。 我们经常使用一些docker管理平台,如…

    Java 2023年5月30日
    0151
  • CORS与CSRF在Spring Security中的使用

    背景 在项目使用了Spring Security之后,很多接口无法访问了,从浏览器的网络调试窗看到的是CORS的报错和403的报错 分析 我们先来看一下CORS是什么,和它很相似的…

    Java 2023年6月5日
    093
  • JS的一些对象

    类:模板,原型对象 对象:具体的实例 原型对象: var user = { name:”xiaoxiao”, age:5, run:function(){ …

    Java 2023年6月7日
    0101
  • 日常白痴_get请求中的特殊字符

    在Get请求中看见 & 早已见怪不怪了,但今天忽然在代码中拼接请求的时候看见了 %20,这就尴尬了,忽然不认得,这是什么东西了,后来查了一下,原来get请求会需要对一些特殊…

    Java 2023年6月7日
    080
  • Java定时器Timer和TimerTask

    方式一:设定指定任务task在指定时间time执行 schedule(TimerTask task, Date date) public static void main (Str…

    Java 2023年6月15日
    091
  • Oracle数据库😊

    sqlplus常用命令 连接数据库:conn 用户名/密码@网络服务标识[as sysdba] 断开数据库连接: 断开和oracle的连接但是不退出sqlplus窗口 区别:sta…

    Java 2023年6月15日
    053
  • Java数组

    数组可以存放 多个 同一类型 的数据,是 引用类型 一般使用方式 先定义并声明 int[] arr = new int[5]; // 默认为值数据类型的值 行可以先声明 再分配空间…

    Java 2023年6月7日
    081
  • [nginx] async_mode_nginx CPU 100% deadlock问题分析

    很遗憾只定位到了一个比较小的问题范围,理清了root cause, 但是没有找到复现的边界条件以及solution. Hi all, I have the quite same p…

    Java 2023年5月30日
    086
  • Java SimpleDateFormat[转]

    [补充] [转] http://stackoverflow.com/questions/2603638/why-cant-this-simpledateformat-parse-t…

    Java 2023年5月29日
    0107
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球