Elasticsearch第二篇之数据操作

薄洪涛6年前PHP1179

    上一篇向大家讲解了Elasticsearch的部署安装和基本设置,这篇文章就和大家一起熟悉下Elastic的数据库操作,和普通数据库不同,es库需要公告restful接口进行数据操作;

    在这之前,说一下基本的概念

    基本概念

    1.节点和集群

    Elasticsearch本身就是一个分布式的数据库,使多台服务器作为一个整体工作,每台服务器上都运行Elasticsearch的实例,单台Elasticsearch实例称为节点,多个节点组成了集群

    2.Index

    Elasticsearch的顶级单位叫Index(类似mysql中的一个库),Index的名字必须小写;

    3.Document

    Document是Index的组成元素,多个Document构成了Index,Document使用json格式来表示,比如下面的例子,同一个Index,Document的结构最好相同,也可以不同,相同的话搜索效率比较高;

{
  "user": "机智的Coder",
  "title": "Coder",
  "desc": "无所不能的Coder"}

    4.Type

  Document可以分组(千万不要和mysql中的分组类比,压根就不是一回事),Type用来将Index中的Document分组过滤;它是一个虚拟的分组,比如一个存储程序员的Index中,可以按职业分成php程序员和python程序员两个组(或者更多);不过未来Elastic在7版本中会考虑移除Type

查看每个Index中的所有Type
$ curl 'localhost:9200/_mapping?pretty=true'
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields

  基本操作

    基础说完了,开始实践,第一步当然是启动Elastic了,bin目录下启动

[bohongtao@wtstrain bin]$ ./elasticsearch

    启动成功后,开始学习数据操作,当然,以下的操作推荐大家使用postman进行请求接口;

    1.新建Index

    Index的名字--coder务必小写,创建成功返回如下

[bohongtao@wtstrain ~]$ curl -X PUT 'localhost:9200/coder'
{"acknowledged":true,"shards_acknowledged":true}[bohongtao@wtstrain ~]$

    2.删除Index

[bohongtao@wtstrain ~]$ curl -X DELETE 'localhost:9200/coder'
{"acknowledged":true}[bohongtao@wtstrain ~]$

    3.插入数据

    向coder里面的php分组插入一条数据,并制定id为1

[bohongtao@wtstrain ~]$ curl -X PUT 'localhost:9200/coder/php/1' -d '
> {
>   "user": "张三",
>   "title": "PHP工程师",
>   "desc": "php是世界上最好的语言"
> }'

    返回如下json对象表示插入成功,会给出Index ,Type , Id,Version等信息

{
    "_index":"coder",
    "_type":"php",
    "_id":"1",
    "_version":1,
    "result":"created",
    "_shards":
    {"total":2,"successful":1,"failed":0},
    "created":true
}
[bohongtao@wtstrain ~]$

注意:1.id不一定是数字

          2.如果Index不存在,会自动创建

          3.可以不指定id,会返回随机的ID

    如下也可以使用post请求,添加一个记录,如下;

[bohongtao@wtstrain ~]$ curl -X POST 'localhost:9200/coder/php/1' -d '
> {
>   "user": "李四",
>   "title": "PHP工程师",
>   "desc": "php是世界上最好的语言"
> }'

    4.查询记录

查询某条数据

    请求的URL中pretty=true表示以易读的格式返回

    found:true 表示查询成功

    _source  返回原始记录

[bohongtao@wtstrain ~]$ curl 'localhost:9200/coder/php/1?pretty=true'
{
  "_index" : "coder",
  "_type" : "php",
  "_id" : "1",
  "_version" : 2,
  "found" : true,
  "_source" : {
    "user" : "李四",
    "title" : "PHP工程师",
    "desc" : "php是世界上最好的语言"
  }
}

查询所有的数据

[bohongtao@wtstrain ~]$ curl 'localhost:9200/coder/php/_search'
{"took":2,"timed_out":false,"_shards":{"total":5,"successful":5,
"failed":0},"hits":{"total":1,"max_score":1.0,
"hits":[{"_index":"coder","_type":"php","_id":"1","_score":1.0,"_source":
{
  "user": "李四",
  "title": "PHP工程师",
  "desc": "php是世界上最好的语言"
}}]}}
[bohongtao@wtstrain ~]$

    其中took表示耗时多少毫秒,timeout表示是否超时,hits表示命中的记录

    total返回记录数,max_score表示最高匹配程度

    hits返回记录组成的数组

    5.删除记录

[bohongtao@wtstrain ~]$ curl -X DELETE 'localhost:9200/coder/php/1'
{"found":true,"_index":"coder","_type":"php","_id":"1","_version":3,"result":"deleted","_shards":{"total":2,"successful":1,"failed":0}}
[bohongtao@wtstrain ~]$

    6.更新记录

    其实更新和上诉的插入记录是一致的,指定id为1直接覆盖已有的id为1的数据,但是如下字段会发生变化

"_version" : 2,
"result" : "updated",
"created" : false

    基本操作都说完了,下面说下高级点的全文搜索

    多说一句,Elastic的搜索效率远远远远高于mysql

[bohongtao@wtstrain ~]$ curl 'localhost:9200/coder/php/_search'  -d '
> {
>   "query" : { "match" : { "desc" : "php" }}
> }'
{"took":4,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":0.28488502,"hits":[{"_index":"coder","_type":"php","_id":"1","_score":0.28488502,"_source":
{
  "user": "李四",
  "title": "PHP工程师",
  "desc": "php是世界上最好的语言"
}}]}}
[bohongtao@wtstrain ~]$

    可以指定参数size调整返回结果的数量

curl 'localhost:9200/coder/php/_search'  -d '
{
  "query" : { "match" : { "desc" : "php" }},
  "size": 1
}'

    可以指定from字段,指定开始位置(默认从位置0开始搜索)

curl 'localhost:9200/coder/php/_search'  -d '
{
  "query" : { "match" : { "desc" : "php" }},
  "size": 1,
  "from":1
}'

    逻辑运算 or

curl 'localhost:9200/coder/php/_search'  -d '
{
  "query" : { "match" : { "desc" : "php 语言" }}
}'

    逻辑运算 and

curl 'localhost:9200/coder/php/_search'  -d '
{
  "query": {
    "bool": {
      "must": [
        { "match": { "desc": "php" } },
        { "match": { "desc": "语言" } }
      ]
    }
  }
}'

    基本的数据操作就介绍到这里。


标签: Elasticsearch

相关文章

Elasticsearch集群第一篇之安装

Elasticsearch集群第一篇之安装

    全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。它可以快速地储存...

Elasticsearch按照日期聚合

Elasticsearch按照日期聚合

我们现在做的是医疗的业务,有个需求是这样的,查询出某位医生前七天的坐诊记录,并且,医生的坐诊记录是不连续的,这样就需要写一个dsl语句来实现es库的搜索首先我使用了es库中的聚合功能,按照日期去聚合,...

php使用curl获取elasticsearch中数据

我最近在做一个电动车的项目,其中,有一个功能是这样的,我需要获取指定车辆的最新的五条位置信息,位置信息是保存到es库中的,我使用的是Yii2.0框架,本来想使用Yii封装的组件去获取数据的,然后觉得麻...

Elasticsearch为什么搜索那么快?

Elasticsearch为什么搜索那么快?

介绍Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lu...

Elasticsearch第三篇之全文搜索及在Yii2.0中的使用

Elasticsearch第三篇之全文搜索及在Yii2.0中的使用

前几天做了一个模块,大数据的搜索,其实也不是特别大,组合起来差不多800万左右,用的是mysql数据库,需求有这么变态的两点;需要按照地址去搜索按照起止时间去搜索别的不说,就这两条,mysql也就只能...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。