ElasticSearch 基础概念及RESTful API

基本概念

索引
可以把索引看成关系型数据库的表,索引的结构是为快速有效的全文索引准备的。Elasticsearch可以把索引存放在一台机器或者分散在多台服务器上,每个索引有一或多个分片(shard),每个分片可以有多个副本(replica)。
事实上,我们的数据被存储在分片(shards)中,索引只是一个把一个或多个分片分组在一起的逻辑空间。我们的程序完全不用关心分片。对于我们的程序而言,文档存储在索引(index)中。剩下的细节由Elasticsearch完成

文档
存储在Elasticsearch中的主要实体叫文档(document)。用关系型数据库来类比的话,一个文档相当于数据库表中的一行记录。Elasticsearch和MongoDB中的文档类似,都可以有不同的结构,但Elasticsearch的文档中,相同字段必须有相同类型。文档由多个字段组成,每个字段可能多次出现在一个文档里,这样的字段叫多值字段(multivalued)。
每个字段的类型,可以是文本、数值、日期等。字段类型也可以是复杂类型,一个字段包含其他子文档或者数组。
一个文档不只有数据。它还包含了元数据(metadata).三个必须的元数据节点是:
_index 文档存储的地方
_type 文档代表的对象的类
_id 文档的唯一标识
映射
所有文档写进索引之前都会先进行分析,如何将输入的文本分割为词条、哪些词条又会被过滤,这种行为叫做映射(mapping)。一般由用户自己定义规则。
文档类型
在Elasticsearch中,一个索引可以存储很多不同用途的对象。例如,一个博客应用程序可以保存文章和评论。每个文档可以有不同的结构。就像传统数据库表中的列一样。所有类型下的文档被存储在同一个索引下,但是类型的映射(mapping)会告诉Elasticsearch不同的文档如何被索引。不同的文档类型不能为相同的属性设置不同的类型。
例如,在同一索引中的所有文档类型中,title的字段必须具有相同的类型

RESTful API

在Elasticsearch中,提供了功能丰富的RESTful API的操作,包括基本的CRUD、创建索引、删除索引等操作

创建非结构化索引

接口:PUT http://192.168.12.10:9200/haoke/

参数:
创建haoke索引

{
"settings": {
"index": {
"number_of_shards": "1",
"number_of_replicas": "0"
}
}
}

接口响应:

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

创建后在elasticsearch-head中可以看索引信息
在这里插入图片描述

删除索引

接口:DELETE http://192.168.12.10:9200/haoke
参数:

{
 "acknowledged": true
}
插入数据

URL规则:POST /{索引}/{类型}/{id}
接口 :POST http://192.168.12.10:9200/haoke/user/1004
参数:

{
 "id":1004,
 "name":"张三4",
 "age":25,
 "sex":"男"
}

响应:

{
    "_index": "haoke",
    "_type": "user",
    "_id": "1004",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 4,
    "_primary_term": 1
}

说明:重复put数据会覆盖原数据 版本号增加1

更新数据

接口:POST http://192.168.12.10:9200/haoke/user/1001/_update
参数:

{
"doc":{
"age":26
}
}
删除数据

接口:DELETE http://192.168.12.10:9200/haoke/user/1001

说明:删除一个文档也不会立即从磁盘上移除,它只是被标记成已删除。Elasticsearch将会在你之后添加更多索引的时候才会在后台进行删除内容的清理。

搜索数据

搜索所有数据
接口:GET http://192.168.12.10:9200/haoke/user/_search

搜索 属性age=20 的user 数据
接口: GET http://192.168.12.10:9200/haoke/user/_search?q=age:20

查询_id为1004的用户且只返回id Name两个属性
接口: GET http://192.168.12.10:9200/haoke/user/1004?_source=id,name

DSL搜索

接口: POST http://192.168.12.10:9200/haoke/user/_search

查询age=20的user数据
参数:

{
"query" : {
"match" : { 
"age" : 20
}
}
}

查询年龄大于23的男士

{
  "query": {
    "bool": {
      "filter": {
        "range": {
           "age": {
           "gt": 23
         }
       }
     },
      "must": {
        "match": {
          "sex": "男"
        }
     }
   }
 }
}

根据用户名全文检索
参数:

{
  "query": {
    "match": {
      "name": "张三3 张三2"
    }
   }
}

查询结果高亮显示
参数:

{
  "query": {
    "match": {
      "name": "张三3 张三2"
    }
   },
  "highlight": {
     "fields": {
        "name": {}
     }
  }
}
判断文档是否存在

接口: HEAD http://192.168.12.10:9200/haoke/user/1004
如果接口返回状态为200 则证明_id=1004 的文档存在 返回404 标识文档不存在

批量查询

接口:GET/POST http://192.168.12.10:9200/haoke/user/_mget
参数:
查询id为1002和1003 的用户(如果,某一条数据不存在,不影响整体响应,需要通过结果进行判断是否查询到数据)

{
 "ids" : [ "1002", "1003" ]
}
批量操作

在Elasticsearch中,支持批量的插入、修改、删除操作,都是通过_bulk的api完成的
接口:POST http://192.168.12.10:9200/haoke/user/_bulk
参数格式如下:

{ action: { metadata }}\n
{ request body    }\n
{ action: { metadata }}\n
{ request body    }\n

其中 action 需要是 index, create, delete and update 中的一个,批量导入的 json 文件最后必须要以\n结尾,也就是需要一个空行

批量插入数据参数

{"create":{"_index":"haoke","_type":"user","_id":2001}}
{"id":2001,"name":"name1","age": 20,"sex": "男"}
{"create":{"_index":"haoke","_type":"user","_id":2002}}
{"id":2002,"name":"name2","age": 20,"sex": "男"}
{"create":{"_index":"haoke","_type":"user","_id":2003}}
{"id":2003,"name":"name3","age": 20,"sex": "男"}

批量删除数据参数

{"delete":{"_index":"haoke","_type":"user","_id":2001}}
{"delete":{"_index":"haoke","_type":"user","_id":2002}}
{"delete":{"_index":"haoke","_type":"user","_id":2003}}

由于delete没有请求体,所以,action的下一行直接就是下一个action

分页查询

和SQL使用 LIMIT 关键字返回只有一页的结果一样,Elasticsearch接受 from 和 size 参数进行分页
size: 结果数,默认10
from: 跳过开始的结果数,默认0
如果你想每页显示5个结果,页码从1到3,那请求如下:
GET / http://192.168.12.10:9200/haoke/user/_search?size=5
GET /http://192.168.12.10:9200/haoke/user/_search?size=5&from=5
GET /http://192.168.12.10:9200/haoke/user/_search?size=5&from=10

尽量不要分页太深或者一次请求太多的结果。因为一个搜索请求常常涉及多个分片。每个分片生成自己排好序的结果,然后集中起来排序以确保整体排序正确。
假设在一个有5个主分片的索引中搜索。当我们请求结果的第一页(结果1到10)时,每个分片产生自己最顶端10个结果然后返回它们给请求节点(requesting node),它再排序这所有的50个结果以选出顶端的10个结果。现在假设我们请求第1000页——结果10001到10010。工作方式都相同,不同的是每个分片都必须产生顶端的10010个结果。然后请求节点排序这50050个结果并丢弃50040个,可以看到在分布式系统中,排序结果的花费随着分页的深入而成倍增长。这也是为什么网络搜索引擎中任何语句不能返回多于1000个结果的原因

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

catch that elf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值