Elasticsearch(二)- 基础操作

132 阅读6分钟

数据格式

Elasticsearch 是面向文档性数据库,一条数据在这里就是一个文档。
我们将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比

image.png

ES 里的 Index 可以看作一个库,而 Type 相当于表,Document 相当于表的行。
这里 Type 的概念已经逐渐弱化了,ES6 中,一个 Index 下只能包含一个 Type,ES7 中,Type已经被删除了。

索引操作

我没有安装ES的图形化界面工具,我这里就使用 Postman 来进行测试

创建索引

对比关系型数据库,创建索引就相当于创建数据库
向 ES 服务器发 PUT 请求:http://127.0.0.1:9200/shopping
解释:PUT 表示创建 请求: http://ES地址/创建索引的名字
不能重复创建。
结果如下图则表示创建成功了: image.png

查询索引

  • 查询一个索引

向 ES 服务器发 GET 请求:http://127.0.0.1:9200/shopping
解释:GET 表示查询 请求: http://ES地址/创建索引的名字
返回索引的信息,结果如下图: image.png

image.png

  • 查询全部索引信息

向 ES 服务器发 GET 请求:http://127.0.0.1:9200/_cat/indices?v
解释: GET 表示查询 请求: http://ES地址/固定路径 v 参数表示展示详细信息
_cat 表示查询的意思
结果如下图:

image.png

删除索引

向 ES 服务器发 DELETE 请求:http://127.0.0.1:9200/shopping
解释:DELETE 表示删除 请求: http://ES地址/需要删除的索引名字
结果如下图:
现在再来查询就已经没有这个索引了 image.png

文档操作

创建文档

索引已经创建好之后,接下来我们创建文档,并添加数据。这里的文档可以类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式
向 ES 服务器发 POST 请求:http://127.0.0.1:9200/shopping/_doc
解释: 请求: http://ES地址/操作的索引名字 _doc 表示索引中添加文档数据的意思
不能使用 PUT 请求 (结果可能不幂等)
请求体内容为:

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

结果如下图:

image.png
从上图中可以看到服务器返回了一个 id 属性,这个是服务器随机生成的,如果我们需要指定 id,可以在刚才的路径后面拼接 id 即可,如:
http://127.0.0.1:9200/shopping/_doc/我们自己的id
如果想要更明确我们的操作是新增,可以把路径中的 _doc 修改为 _create,都可以完成创建 http://127.0.0.1:9200/shopping/_create/1002

查询文档

向 ES 服务器发 GET 请求:http://127.0.0.1:9200/shopping/_doc/1001
解释:GET 表示查询 请求: http://ES地址/操作的的索引名字/_doc/查询文档的id _doc表示文档操作

结果如下图:
可以看到在返回的 _source 中就是我们刚才存入的数据 image.png
如果查询的 id 不存在,则会返回 false,如下图:

image.png
查询所有数据
向 ES 服务器发 GET 请求:http://127.0.0.1:9200/shopping/_search
解释:GET 表示删除 请求: http://ES地址/操作的的索引名字/_search
结果如下图:

image.png

修改文档

  1. 完全覆盖

向 ES 服务器发 PUT 请求:http://127.0.0.1:9200/shopping/_doc/1001
解释:PUT 表示修改 请求: http://ES地址/操作的的索引名字/_doc/修改文档的id _doc表示文档操作
把修改之后的数据放到请求体中发送给服务器

{
    "title":"小米手机",
    "category":"小米",
    "images":"http://127.0.0.1/xm.jpg",
    "price":4999.00
}

结果如下图:
现在再查询查出来的就是修改后的值了 image.png

  1. 局部修改

向 ES 服务器发 POST 请求:http://127.0.0.1:9200/shopping/_update/1001
解释:POST 表示修改 请求: http://ES地址/操作的的索引名字/_update/修改文档的id _update 表示修改操作
把修改之后的数据放到请求体中发送给服务器 doc 中填写需要修改的数据

{
    "doc":{
        "title":"华为手机"
    }
}

结果如下:
现在再查询就是修改后的数据了 image.png

删除文档

向 ES 服务器发 DELETE 请求:http://127.0.0.1:9200/shopping/_doc/1001
解释:DELETE 表示删除 请求: http://ES地址/操作的的索引名字/_doc/修改文档的id _doc 表示文档操作
结果如下:

image.png

查询文档

在实际开发中,使用最多的还是查询操作,这里单独拿出来介绍一下。

条件查询

向 ES 服务器发 GET 请求:http://127.0.0.1:9200/shopping/_search?q=category:小米 解释:GET 表示查询 请求: http://ES地址/操作的的索引名字/_search
_search 表示查询操作 q 表示查询条件 category:小米 中:就是 = 的意思
该请求表示查询 shopping 索引中 category为 小米 的数据 结果如下:

image.png

上面我们是在路径上面写的查询条件,在一些情况下,并不合适,我们也可以把查询条件写在请求体中,如:
query: 查询条件
match: 匹配条件

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

结果和上面一样

分页查询

向 ES 服务器发 GET 请求:http://127.0.0.1:9200/shopping/_search 解释:GET 表示查询 请求: http://ES地址/操作的的索引名字/_search
请求体:
match_all: 全量匹配,就是查所有的数据 from:数据起始位置 size:每页数据条数

{
    "query":{
        "match_all":{

        }
    },
    "from":0,
    "size":2
}

image.png

上面查询的数据都是返回的全部字段,如果我们只想要返回指定字段,如 title,我们可以在请求体中进行设置
_source:需要返回的字段

{
    "query":{
        "match_all":{

        }
    },
    "from":0,
    "size":2,
    "_source":["title"]
}

如果需要排序:
sort: 表示排序
price:按照哪个字段排序
"order":"desc" 按照降序排列

{
    "query":{
        "match_all":{

        }
    },
    "from":0,
    "size":2,
    "_source":["title"],
    "sort":{
        "price":{
            "order":"desc"
        }
    }
}

多条件查询

向 ES 服务器发 GET 请求:http://127.0.0.1:9200/shopping/_search 解释:GET 表示查询 请求: http://ES地址/操作的的索引名字/_search
具体的查询条件在请求体中书写
bool : 表示查询条件 must : 表示全部要同时成立 should : 表示或者,有一个成立即可 must 可以换成 should

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

范围查询
添加一个 filter 来设置查询的范围

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

全文检索

请求和上面的查询请是一样的,我们只需要修改查询的请求体即可
这样就是把 小花 拆开来进行全文检索

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

如果我们需要完全匹配

{
    "query":{
        "match_phrase":{
            "category":"小花"
        }
    }
}

高亮显示

{
    "query":{
        "match_phrase":{
            "category":"小"
        }
    },
    "highlight":{
        "fields":{
            "category":{}
        }
    }
}

聚合操作

{
    "aggs":{ //聚合操作
        "price_group":{// 统计结果的名称,随意起名字
            "terms":{ // 分组 avg 表示平均值
                "field":"price" // 分组字段
            }
        }
    }
}

映射关系

向 ES 服务器发 PUT 请求:http://127.0.0.1:9200/user/_mapping 解释:PUT 请求: http://ES地址/操作的的索引名字/_mapping

image.png index 为 false 表示不可以通过这个来作为查询条件 请求方式改为 GET 即可查询映射关系