ElasticSearch初探之基本概念和CRUD(二)

  • 基本概念简介

index:索引,相当于关系数据库中的数据库database
type:类型,类似关系数据库中table
document:文档,相当于表中行记录row
field:列,相当于table中的colum
shard:分片,每个index包含多个shard,每个shard是保存数据的lucene实例。shard又分为:primary shard(ps) 和replica shard(rs),即主分片和副本分片,默认ps= 5,type中的每个document只能存在其中一个ps以及和它对应的rs中,ps和它对应的rs不能在同一个节点内(容错考虑)。

  • 一个索引创建后,primary shard不可修改,但为了集群的高可用性和便于横向扩展replica shard可以动态修改。
PUT /users/_settings
{
   "number_of_replicas" : 10 //修改副本分片数
}
  • 基本操作举例

es是完成基于RESTful web接口规范,以下基于rest风格举例
查看es状态

[root@Eden666 ~]# curl -XGET 'http://localhost:9200/_cluster/health?pretty'
{
  "cluster_name" : "elasticsearch",
  "status" : "yellow", //三种状态:green 完全可用,集群功能齐全,yellow:所有数据可用,但是有些副本尚未分配,red:部分数据有丢失
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 5, //初始5个primary shard 分片
  "active_shards" : 5,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 5,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 50.0
}

1、新增数据(POST),其中users就是index,coder是type,id就是field,若出现以下情况是因为es6.x版本需加入headers之Content-type(所有请求方式都一样),详情可参考官网(https://www.elastic.co/blog/strict-content-type-checking-for-elasticsearch-rest-requests

[root@Eden666 ~]# curl -XPOST  'localhost:9200/users/coder/3?pretty=true' -d '{"name":"eden03","age":10}'
{
  "error" : "Content-Type header [application/x-www-form-urlencoded] is not supported",
  "status" : 406
}
[root@Eden666 ~]# curl -H 'Content-type:application/json' -XPOST  'localhost:9200/users/coder/3?pretty=true' -d '{"name":"eden03","age":10}'
{
  "_index" : "users",
  "_type" : "coder",
  "_id" : "3",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 3,
  "_primary_term" : 2
}

2、修改(PUT)

[root@Eden666 ~]# curl -H 'Content-type:application/json' -XPUT  'localhost:9200/users/coder/3?pretty=true' -d '{"name":"eden03-new","age":100}'
{
  "_index" : "users",
  "_type" : "coder",
  "_id" : "3",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 4,
  "_primary_term" : 2
}

3、查看(GET)

[root@Eden666 ~]# curl   -XGET  'localhost:9200/users/coder/3?pretty=true' 
{
  "_index" : "users",
  "_type" : "coder",
  "_id" : "3",
  "_version" : 2,
  "found" : true,
  "_source" : {
    "name" : "eden03-new",
    "age" : 100
  }
}

4、删除(DELETE),可以发现删除查询结果返回found=false

[root@Eden666 ~]# curl   -XDELETE  'localhost:9200/users/coder/3?pretty=true' 
{
  "_index" : "users",
  "_type" : "coder",
  "_id" : "3",
  "_version" : 3,
  "result" : "deleted",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 5,
  "_primary_term" : 2
}
[root@Eden666 ~]# curl localhost:9200/users/coder/3?pretty=true
{
  "_index" : "users",
  "_type" : "coder",
  "_id" : "3",
  "found" : false
}

5、其他检索方式,查询字符串方式和DSL(Domain Specific Language特定领域语言)方式

  • 字符串查询:具有局限性,不够灵活
[root@Eden666 ~]# curl localhost:9200/users/coder/_search?pretty=true
{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "users",
        "_type" : "coder",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "name" : "eden02",
          "age" : 30
        }
      },
      {
        "_index" : "users",
        "_type" : "coder",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name" : "eden01",
          "age" : 20
        }
      }
    ]
  }
}
[root@Eden666 ~]#  curl  'localhost:9200/users/coder/_search?q=name:eden01&pretty'
{
  "took" : 14,  //查询毫秒数
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "users",
        "_type" : "coder",
        "_id" : "1",
        "_score" : 0.2876821,  //检索的document的分数,分数越高越容易检索到
        "_source" : {
          "name" : "eden01",
          "age" : 20
        }
      }
    ]
  }
}
  • DSL方式:可以建立复杂查询条件。match:匹配的字段值,size:指定返回document数,from:位移量,默认是0
[root@Eden666 ~]# curl -H "Content-Type:application/json"  -XGET 'localhost:9200/users/coder/_search?pretty' -d  '{"query":{"match":{"name":"eden02"}},"size":1,"from":0}'
{
  "took" : 9,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "users",
        "_type" : "coder",
        "_id" : "2",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "eden02",
          "age" : 30
        }
      }
    ]
  }
}
  • DSL查询之 or 和 and检索
//or检索:"query":{"match":{"name":"eden02 eden01"}}
[root@Eden666 ~]# curl -H "Content-Type:application/json"  -XGET 'localhost:9200/users/coder/_search?pretty' -d  '{"query":{"match":{"name":"eden02 eden01"}},"size":10,"from":0}'
{
  "took" : 13,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "users",
        "_type" : "coder",
        "_id" : "2",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "eden02",
          "age" : 30
        }
      },
      {
        "_index" : "users",
        "_type" : "coder",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "eden01",
          "age" : 20
        }
      }
    ]
  }
}
//and检索需使用到布尔查询
//{"bool": {"must": [ { "match": { "name": "eden01" } },{ "match": { "age": 20 } }]}}
[root@Eden666 ~]# curl -H "Content-Type:application/json"  -XGET 'localhost:9200/users/coder/_search?pretty' -d  '{"query":{"bool": {"must": [ { "match": { "name": "eden01" } },{ "match": { "age": 20 } }]}},"size":10,"from":0}'
{
  "took" : 19,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.287682,
    "hits" : [
      {
        "_index" : "users",
        "_type" : "coder",
        "_id" : "1",
        "_score" : 1.287682,
        "_source" : {
          "name" : "eden01",
          "age" : 20
        }
      }
    ]
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容