ES是面向文档的分析搜索引擎
(1)应用系统的数据结构基本上都是面向对象的。
(2)对象数据存储到数据库当中,只能拆解开来,变为扁平的多张表,每次查询的时候还需要还原为对象格式,相当麻烦。
(3)ES是面向文档的,文档中存储的数据结构,与面向对象的数据结构是一样的,基于这种文档数据结构,es可以提供复杂的索引,全文检索,分析聚合等功能。
(4)ES的document是用json数据格式来表达。
前提:安装并启动es.使用kibana工具做相关操作,本次操作以及后续都基于ES5。
es提供了一套cat api,可以帮助我们es中的相关数据
(1)快速查看集群的健康状况? yellow,green,red?
GET _cat/health?v
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1560233646 14:14:06 elasticsearch yellow 1 1 1 1 0 0 1 0 - 50.0%
es的状态有下面三个:
green:每个索引的primary shard 和 replica shard 都是active状态。
yellow:每个索引的primary shard都是active状态,但是部分replica shard不是active状态,处于不可用的状态。
red:不是所有的primary shard都是active状态,部分索引有数据丢失了。
这里因为只启动了一个es进程,也就是一个node,现在es当中只有一个index,是kibana自己内置建立的index。默认的配置是一个index分配5个primary shard 和 5 个 replica shard。这里只有kibana内置的一个index启动了。而primary shard 和 replica shard是不够的在同一台机器上的(为了容错)。所以此时是yellow状态。此时只要再启动第二个es进程,状态就会变成green了。
(2)快速查看集群中有哪些索引
GET _cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open .kibana dbYTE7RTScupaV8INtITYQ 1 1 1 0 3.1kb 3.1kb
(3)简单的索引操作
创建索引:put /索引名
例:put /test_index?pretty
删除索引:delete /索引名
例:delete /test_index?pretty
(4)商品的CRUD
1. 新增商品,创建文档,建立索引 格式: put /index/type/id { json 数据}
例:
put /ecommerce/produce/1
{
"name": "gaolujie yaogao",
"desc": "gaoxiao meibai",
"price": 30,
"producer": "gaolujie producer",
"tags": ["meibai", "fangzhu"]
}
es会自动创建index和type,不用我们去提前创建好,而且es会默认对document的每个field字段建立倒排索引,让其可以被搜索。
2. 查询商品:检索文档 格式: get /index/type/id
例:GET /ecommerce/product/3
{
"_index": "ecommerce",
"_type": "product",
"_id": "3",
"_version": 1,
"found": true,
"_source": {
"name": "zhonghua yagao",
"desc": "caoben zhiwu",
"price": 40,
"producer": "zhonghua producer",
"tags": [
"qingxin"
]
}
}
3. 替换文档
PUT /ecommerce/product/1
{
"name" : "jiaqiangban gaolujie yagao",
"desc" : "gaoxiao meibai",
"price" : 30,
"producer" : "gaolujie producer",
"tags": [ "meibai", "fangzhu" ]
}
get /ecommerce/product/1
{
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"_version": 2,
"found": true,
"_source": {
"name": "jiaqiangban gaolujie yagao",
"desc": "gaoxiao meibai",
"price": 30,
"producer": "gaolujie producer",
"tags": [
"meibai",
"fangzhu"
]
}
}
替换方式的麻烦之处在于每次替换都要带上所有的field,才能去正确的进行信息修改。
那怎么进行只更新部分字段的操作?
POST /ecommerce/product/1/_update
{
"doc": {
"name": "chaojiban gaolujie yaogao"
}
}
result:
{
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"_version": 3,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
}
}
GET /ecommerce/product/1
{
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"_version": 3,
"found": true,
"_source": {
"name": "chaojiban gaolujie yaogao",
"desc": "gaoxiao meibai",
"price": 30,
"producer": "gaolujie producer",
"tags": [
"meibai",
"fangzhu"
]
}
}
4. 删除文档
格式: delete /index/type/id
DELETE /ecommerce/product/1