文章目录
- 一、 数据的 分类
- 二、 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
}
}
}