Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒内)。
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。索引类似于关系型数据库中Database 的概念。在一个集群中,如果你想,可以定义任意多的索引。
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数 据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可 以为评论数据定义另一个类型。类型类似于关系型数据库中Table的概念。
NOTE: 在5.x版本以前可以在一个索引中定义多个类型,6.x之后版本也可以使用,但是不推荐,在7~8.x版本中彻底移除一个索引中创建多个类型。
Mapping是ES中的一个很重要的内容,它类似于传统关系型数据中table的schema,用于定义一个索引(index)中的类型(type)的数据的结构。 在ES中,我们可以手动创建type(相当于table)和mapping(相关与schema),也可以采用默认创建方式。在默认配置下,ES可以根据插入的数据自动地创建type及其mapping。 mapping中主要包括字段名、字段数据类型和字段索引类型。
一个文档是一个可被索引的基础信息单元,类似于表中的一条记录。比如,你可以拥有某一个员工的文档,也可以拥有某个商品的一个文档。文档以采用了轻量级的数据交换格式JSON(JAVAscript Object Notation)来表示。
7.1、索引操作
我们先使用命令行的方式 curl 发送请求:
查看ES服务健康状态:
curl -X GET "ip地址:9200/_cat/health?v"
查看ES服务中的节点:
curl -X GET "ip地址:9200/_cat/nodes?v
查看ES服务中的所有索引:
curl -X GET "ip地址:9200/_cat/indices?v"
新增索引:
删除索引:
从上面我们也能发现,每次使用 curl 去手动输入请求ES 服务不太方便,所以我们用 Postman 请求模拟工具来替代手动输入!
新建索引:
新建文档并指定id:
PUT IP地址:9200/myindex/_doc/1
根据id查询数据:
GET IP地址:9200/myindex/_doc/1
根据id修改数据:
PUT IP地址:9200/myindex/_doc/1
修改数据和新建一个文档一样,都是自定id 然后PUT 提交数据:
根据id删除数据:
DELETE IP地址:9200/myindex/_doc/1
7.2 索引搜索
为了搜索展示方便,先向ES 中添加一些数据:
PUT IP 地址:9200/myindex/_doc/1
{
"title":"海贼王",
"content":"船长是路飞,副船长是索隆~"
}
PUT IP 地址:9200/myindex/_doc/2
{
"title":"火影忍者",
"content":"七代火影是鸣人,八代火影是木叶丸~"
}
PUT IP 地址:9200/myindex/_doc/3
{
"title":"一拳超人",
"content":"主角是埼玉,配角是杰诺斯~"
}
PUT IP 地址:9200/myindex/_doc/4
{
"title":"进击的巨人",
"content":"人类最牛的是兵长,巨人最菜的是男主~"
}
PUT IP 地址:9200/myindex/_doc/5
{
"title":"名侦探柯南",
"content":"男主是柯南,女主不确定~"
}
PUT IP 地址:9200/myindex/_doc/6
{
"title":"海贼王路飞",
"content":"路飞是要成为海贼我的男人~"
}
PUT IP 地址:9200/myindex/_doc/7
{
"title":"路飞的果实能力",
"content":"路飞是吃了橡胶果实的男人~"
}
搜索全部
GET IP地址:9200/myindex/_search
返回结果:
{
"took": 1033,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 7,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "myindex",
"_type": "_doc",
"_id": "5",
"_score": 1.0,
"_source": {
"title": "名侦探柯南",
"content": "男主是柯南,女主不确定~"
}
},
{
"_index": "myindex",
"_type": "_doc",
"_id": "4",
"_score": 1.0,
"_source": {
"title": "进击的巨人",
"content": "人类最牛的是兵长,巨人最菜的是男主~"
}
},
{
"_index": "myindex",
"_type": "_doc",
"_id": "3",
"_score": 1.0,
"_source": {
"title": "一拳超人",
"content": "主角是埼玉,配角是杰诺斯~"
}
},
{
"_index": "myindex",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"title": "火影忍者",
"content": "七代火影是鸣人,八代火影是木叶丸~"
}
},
{
"_index": "myindex",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"title": "海贼王",
"content": "船长是路飞,副船长是索隆~"
}
},
{
"_index": "myindex",
"_type": "_doc",
"_id": "6",
"_score": 1.0,
"_source": {
"title": "海贼王路飞",
"content": "路飞是要成为海贼我的男人~"
}
},
{
"_index": "myindex",
"_type": "_doc",
"_id": "7",
"_score": 1.0,
"_source": {
"title": "路飞的果实能力",
"content": "路飞是吃了橡胶果实的男人~"
}
}
]
}
}
根据单个条件搜索
GET IP地址:9200/myindex/_search?q=title:海贼王
或者
GET IP地址:9200/myindex/_search?q=content:路飞
返回结果:
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1.7349373,
"hits": [
{
"_index": "myindex",
"_type": "_doc",
"_id": "1",
"_score": 1.7349373,
"_source": {
"title": "海贼王",
"content": "船长是路飞,副船长是索隆~"
}
},
{
"_index": "myindex",
"_type": "_doc",
"_id": "6",
"_score": 1.6770141,
"_source": {
"title": "海贼王路飞",
"content": "路飞是要成为海贼我的男人~"
}
},
{
"_index": "myindex",
"_type": "_doc",
"_id": "7",
"_score": 1.6770141,
"_source": {
"title": "路飞的果实能力",
"content": "路飞是吃了橡胶果实的男人~"
}
}
]
}
}
根据多个条件搜索
GET IP地址:9200/myindex/_search
{
"query":{
// 多个匹配
"multi_match":{
// 查询条件为 路飞
"query":"路飞",
// 从title 和 content 字段中匹配是否存在 路飞 的数据
"fields":["title","content"]
}
}
}
返回结果:
{
"took": 32,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 2.2700202,
"hits": [
{
"_index": "myindex",
"_type": "_doc",
"_id": "6",
"_score": 2.2700202,
"_source": {
"title": "海贼王路飞",
"content": "路飞是要成为海贼我的男人~"
}
},
{
"_index": "myindex",
"_type": "_doc",
"_id": "7",
"_score": 1.9412584,
"_source": {
"title": "路飞的果实能力",
"content": "路飞是吃了橡胶果实的男人~"
}
},
{
"_index": "myindex",
"_type": "_doc",
"_id": "1",
"_score": 1.7349373,
"_source": {
"title": "海贼王",
"content": "船长是路飞,副船长是索隆~"
}
}
]
}
}