文章目录
- 一、 数据的 分类
- 二、 ElasticSearch 介绍
- 三、 ElasticSearch 搭建
- 四、正排索引 和 倒排索引
- 五、ES HTTP 索引 操作
- 六、ES HTTP 文档 操作
- 七、ES HTTP 查询数据
- 1. 条件查询
- 2. 分页查询
- 3. 排序查询
- 4. 多条件查询
- 5. 全文检索 完全匹配 高亮显示
- 6. 聚合查询
- 八、 ES HTTP 映射
一、 数据的 分类
结构化数据: 像表格、字段等都属于结构化数据,一般存储在 SQL数据库 中。缺点:一点结构固定,很难再去拓展。
非结构化数据: 像报表、图片、通讯记录、日志、视频等等都属于非结构化数据,一般存储在 NoSQL数据库 中。缺点:这些数据维度广、数据量大,对于数据存储和查询维护起来成本很大。
半结构化数据: 像 html、xml这样的文件 属于半结构化数据。
简而言之,ElasticSearch就是用来处理这几种数据类型的。
二、 ElasticSearch 介绍
ES是一个开源的高扩展的分布式的全文搜索引擎。
Lucene是Apache软件基金会Jakarta项目组的一个子项目,提供了简单强大的应用程式接口,能够做全文检索和搜索,Lucene是基于java研发的,而ES就是基于Lucene的。
Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档。
使用案例:
三、 ElasticSearch 搭建
ES官方:https://www.elastic.co/cn/
下载安装,启动。
启动过程中,可能会遇到各种问题,常见的几个情况:
- jdk版本低。
- 内存空间不足,以下为解决方式。
- 再个就是不能以root用户进行登录。创建或使用其他用户,注意要赋予用户权限。
四、正排索引 和 倒排索引
两种索引类型:
- 正排(正向)索引:
- 倒排索引。
五、ES HTTP 索引 操作
创建索引:(等同于创建数据库)
- 发送put请求。
例如:http://127.0.0.1:9200/shopping 。
请求后面的shopping就是索引名称。(rest风格)
获取索引信息:
- 只需要将方法换成get就可以。
查询所有索引信息:
- http://127.0.0.1:9200/_cat/indices?v (v是一个参数)
删除索引:
- 只需要将方法换成delete就可以。
六、ES HTTP 文档 操作
幂等性操作都可以发送put请求。
幂等性: 所谓的幂等性,是分布式环境下的一个常见问题,一般是指我们在进行多次操作时,所得到的结果是一样的,即多次运算结果是一致的。
创建文档:
- 发送Post请求:
http://127.0.0.1:9200/shopping/_doc 。
注意:body请求体不能为空。- 还可以自定义id:
http://127.0.0.1:9200/shopping/_doc/1001
也可以发送Put请求(幂等性)
还可以通过_create访问:http://127.0.0.1:9200/shopping/_create/1002
查询文档:
- 同上发送get请求:
http://127.0.0.1:9200/shopping/_doc/1001 后面跟的是_id。查询当前索引下的所有文档:
- 发送get请求,访问_search路径:
http://127.0.0.1:9200/shopping/_search
全量文档修改:(全部修改)
- 发送put请求:(幂等性)
http://127.0.0.1:9200/shopping/_doc/1001局部文档修改:(局部修改)
- 发送post请求:
http://127.0.0.1:9200/shopping/_update/1001 (使用_update方便知道调用的局部修改。)
删除文档:
- 发送delete请求:
http://127.0.0.1:9200/shopping/_doc/1001
七、ES HTTP 查询数据
1. 条件查询
get方法直接查询:(有点麻烦,并且参数放到url里面容易乱码)
# get方法直接查询:(有点麻烦,并且参数放到url里面容易乱码)
http://127.0.0.1:9200/shopping/_search?q=category:小米
post方法:(推荐使用)
直接发送match_all不传参数就可以查询全部:
{"query":{"match_all":{}}
}
2. 分页查询
只需要修改对应参数:
{"query":{"match_all":{}},"from":0, // from从第几页开始, 也就是页码"size":2, // 一页多少数据"_source":["title"] // 负责控制返回值_source(里面存着数据的属性),这样就只返回了title属性。
}
3. 排序查询
{"query":{"match_all":{}},"from":0,"size":2,"_source":["title"],"sort":{ // sort负责定义排序操作"price":{ // 指定哪个属性"order":"desc" // 排序方式}}
}
4. 多条件查询
Post请求如下:
{"query":{"bool" : {// 必须匹配的内容中的每一条。"must":[{"match":{"category":"小米"}},{"match":{"price":1999.00}}],// 符合下面其中一个即可"should":[{"match":{"category":"华为"}},{"match":{"price":1999.00}}],// 过滤相关数据"filter":[{"range":{"price":{"gt":5000}}}]}}
}
5. 全文检索 完全匹配 高亮显示
http://127.0.0.1:9200/shopping/_search
全文检索匹配:会进行分词的效果,所有包含 ’ 小 ’ 和 ’ 米 '的都进行匹配出来。
{"query" : {// 全文检索匹配"match" : {"category" : "小米"}}
}
完全匹配:完全进行匹配出来。
{"query" : {// match_phrase是完全匹配。"match_phrase" : {"category" : "小米1"}}
}
高亮显示:
{"query" : {"match_phrase" : {"category" : "小米"}},// 高亮显示效果。"highlight": {"fields" : {"category" : {}}}
}
6. 聚合查询
聚合查询就是 一些像求和,多少数量,平均值等一系列的情况。
{"aggs" : { // 聚合操作"price_group" : { // 名称,随意起名 求平均值用price_avg"terms" : { // 分组"field" : "price" // 分组字段}}},"size" : 0 // 如果只需要聚合数据,不需要原始数据,直接讲size设置为0就可以了。
}
八、 ES HTTP 映射
http://127.0.0.1:9200/user/_mapping
指定某些属性为特殊情况:
{"properties" : {"name" : {"type" : "text","index" : true},"sex" : {"type" : "keyword", // keyword关键字,查询就要精确查询。"index" : true},"tel" : {"type" : "keyword", // 关闭关键字就不会了。"index" : false}}
}