ElasticSearch入门实战1

  1. document数据格式
  2. 电商网站商品管理案例背景介绍
  3. 简单的集群管理
  4. 商品的CRUD操作(document curd)

1. Document数据格式

面向文档的搜索分析引擎

  • 应用系统的数据结构都是面向对象的,复杂的
  • 对象数据存储到数据库中,只能拆解开来,变成扁平的多张表,每次查询的时候还有还原成对象格式,相当麻烦
  • ES是面向文档的,文档中存储的数据结构,与面向对象的数据结构是一样的,基于这种文档数据结构。ES可以提供复杂的索引,全文检索,分析聚合等功能。
  • ES的document用json数据格式来表示的。
代码语言:javascript
复制
public class Employee {
    private String email;
    private String firstName;
    private String lastName;
    private EmployeeInfo info;
    private Date joinDate;
}

private class EmployeeInfo {
private String bio;
private Integer age;
private String[] interesets;
}

EmployeeInfo info = new EmployeeInfo();
info.SetBio("youdi");
info.setAge(24);
info.setInteresets(new String[]{"dance", "code"});

Employee employee = new Employee();
employee.setEmail("@");
employee.setInfo(info);

employee对象:里面包含了Employee类自己属性。需要保存在两张表。
使用ORM.数据库是扁平化的,不能体现出面向对象的结构。

2.电商网站商品管理案例背景介绍

提供功能如下:

  1. 对商品信息进行CRUD
  2. 执行简单的全文检索,以及复杂的phrase检索
  3. 对于全文检索结果,可以进行高亮显示
  4. 对数据进行简单的聚合分析

3. 简单的集群管理

  1. 快速检查集群的健康状况
    ES提供了一套cat api,可以查看es中各种各样的数据
    GET /_cat/health?pretty epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent 1524842572 23:22:52 elasticsearch_youdi yellow 1 1 10 10 0 0 10 0 - 50.0%
    查看status
    Green: 每个索引的primary shard和replica shard 都是active状态
    yellow: 每个索引的primary shard是active状态,但是部分replica shard不是active状态,处于不可用的状态
    red: 不是所有的索引的primary shard都是active状态,部分缩影有数据丢失

为什么现在会处于yellow状态?

primary shard replica shard没有第二个节点

  1. 快速查看集群中所有索引?
代码语言:javascript
复制
GET /_cat/indices?v
health status index    uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   website  -NVtisruRUO1buiENwh7Vw   5   1          1            0      5.5kb          5.5kb
yellow open   megacorp 3YlG1FRPTDynSETmZBDIhg   5   1          3            0     17.5kb         17.5kb
  1. 简单的索引操作
代码语言:javascript
复制
PUT /test_index?pretty

DELETE /test_index?pretty

商品的CURD

  1. 新增商品
代码语言:javascript
复制
PUT /index/type/id

PUT /products/goods/1
{
"name": "test",
"desc": "hello world",
"price": 11.0,
"producer": "hello",
"tags": ["youdi", "haha"]
}

{
"_index": "products",
"_type": "goods",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}

  1. 查询商品
代码语言:javascript
复制
GET /products/goods/1

{
"_index": "products",
"_type": "goods",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"name": "test",
"desc": "hello world",
"price": 11,
"producer": "hello",
"tags": [
"youdi",
"haha"
]
}
}

  1. 更新操作
代码语言:javascript
复制
替换方式: 必须提交所有的信息
PUT /products/goods/1
{
"name": "test3",
"desc": "hello world",
"price": 11.5,
"producer": "hello",
"tags": ["youdi", "haha"]
}

{
"_index": "products",
"_type": "goods",
"_id": "1",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}

PUT /products/goods/1
{
"name": "test3"
}

GET /products/goods/1
{
"_index": "products",
"_type": "goods",
"_id": "1",
"_version": 3,
"found": true,
"_source": {
"name": "test3"
}
}

POST products/goods/1/_update
{
"doc": {
"name": "test6"
}
}

{
"_index": "products",
"_type": "goods",
"_id": "1",
"_version": 5,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 4,
"_primary_term": 1
}

  1. 删除文档
代码语言:javascript
复制
DELETE /products/goods/1
{
"_index": "products",
"_type": "goods",
"_id": "1",
"_version": 6,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 5,
"_primary_term": 1
}

{
"_index": "products",
"_type": "goods",
"_id": "1",
"found": false
}

商品的搜索方式

  1. query string search
  2. Query DSL
  3. query filter
  4. Full-text search

1. query string search

搜索全部商品

代码语言:javascript
复制
GET /products/goods/_search

{
"took": 104, //耗时
"timed_out": false, //是否超时
"_shards": { //_shards
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1, // 查询结果的数量 1条数据
"max_score": 1, //ES对相关度的匹配分数
"hits": [ //包含了搜索的详细数据
{
"_index": "products",
"_type": "goods",
"_id": "2",
"_score": 1,
"_source": {
"name": "tes2",
"desc": "hello world",
"price": 14,
"producer": "hello",
"tags": [
"youdi",
"haha"
]
}
}
]
}
}

{
"took": 8,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "products",
"_type": "goods",
"_id": "2",
"_score": 1,
"_source": {
"name": "tes2",
"desc": "hello world",
"price": 14,
"producer": "hello",
"tags": [
"youdi",
"haha"
]
}
},
{
"_index": "products",
"_type": "goods",
"_id": "1",
"_score": 1,
"_source": {
"name": "test3",
"desc": "hello world",
"price": 11.5,
"producer": "hello",
"tags": [
"youdi",
"haha"
]
}
}
]
}
}

  {
    "_index": "bank",
    "_type": "_doc",
    "_id": "25",
    "_score": 1,
    "_source": {
      "account_number": 25,
      "balance": 40540,
      "firstname": "Virginia",
      "lastname": "Ayala",
      "age": 39,
      "gender": "F",
      "address": "171 Putnam Avenue",
      "employer": "Filodyne",
      "email": "virginiaayala@filodyne.com",
      "city": "Nicholson",
      "state": "PA"
    }
  },</code></pre></div></div><ol class="ol-level-0"><li>搜索账号名字中有ber,而且按照年龄排序</li></ol><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">GET /bank/_doc/_search?q=firstname:Virginia&amp;sort=age:des

{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 4.882802,
"hits": [
{
"_index": "bank",
"_type": "_doc",
"_id": "25",
"_score": 4.882802,
"_source": {
"account_number": 25,
"balance": 40540,
"firstname": "Virginia",
"lastname": "Ayala",
"age": 39,
"gender": "F",
"address": "171 Putnam Avenue",
"employer": "Filodyne",
"email": "virginiaayala@filodyne.com",
"city": "Nicholson",
"state": "PA"
}
}
]
}
}

  1. query DSL

DSL:Domain specified Language 特定领域的语言

查询所有的account

http request body :请求体,可以使用json的格式构建查询语法,比较方便,可以构建各种复杂的语法。

代码语言:javascript
复制
GET /bank/_doc/_search
{
"query": {
"match_all": {}
}
}

{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1000,
"max_score": 1,
"hits": [
{
"_index": "bank",
"_type": "_doc",
"_id": "25",
"_score": 1,
"_source": {
"account_number": 25,
"balance": 40540,
"firstname": "Virginia",
"lastname": "Ayala",
"age": 39,
"gender": "F",
"address": "171 Putnam Avenue",
"employer": "Filodyne",
"email": "virginiaayala@filodyne.com",
"city": "Nicholson",
"state": "PA"
}
},
{
"_index": "bank",
"_type": "_doc",
"_id": "44",
"_score": 1,
"_source": {
"account_number": 44,
"balance": 34487,
"firstname": "Aurelia",
"lastname": "Harding",
"age": 37,
"gender": "M",
"address": "502 Baycliff Terrace",
"employer": "Orbalix",
"email": "aureliaharding@orbalix.com",
"city": "Yardville",
"state": "DE"
}
},
{
"_index": "bank",
"_type": "_doc",
"_id": "99",
"_score": 1,
"_source": {
"account_number": 99,
"balance": 47159,
"firstname": "Ratliff",
"lastname": "Heath",
"age": 39,
"gender": "F",
"address": "806 Rockwell Place",
"employer": "Zappix",
"email": "ratliffheath@zappix.com",
"city": "Shaft",
"state": "ND"
}
},
{
"_index": "bank",
"_type": "_doc",
"_id": "119",
"_score": 1,
"_source": {
"account_number": 119,
"balance": 49222,
"firstname": "Laverne",
"lastname": "Johnson",
"age": 28,
"gender": "F",
"address": "302 Howard Place",
"employer": "Senmei",
"email": "lavernejohnson@senmei.com",
"city": "Herlong",
"state": "DC"
}
},
{
"_index": "bank",
"_type": "_doc",
"_id": "126",
"_score": 1,
"_source": {
"account_number": 126,
"balance": 3607,
"firstname": "Effie",
"lastname": "Gates",
"age": 39,
"gender": "F",
"address": "620 National Drive",
"employer": "Digitalus",
"email": "effiegates@digitalus.com",
"city": "Blodgett",
"state": "MD"
}
},
{
"_index": "bank",
"_type": "_doc",
"_id": "145",
"_score": 1,
"_source": {
"account_number": 145,
"balance": 47406,
"firstname": "Rowena",
"lastname": "Wilkinson",
"age": 32,
"gender": "M",
"address": "891 Elton Street",
"employer": "Asimiline",
"email": "rowenawilkinson@asimiline.com",
"city": "Ripley",
"state": "NH"
}
},
{
"_index": "bank",
"_type": "_doc",
"_id": "183",
"_score": 1,
"_source": {
"account_number": 183,
"balance": 14223,
"firstname": "Hudson",
"lastname": "English",
"age": 26,
"gender": "F",
"address": "823 Herkimer Place",
"employer": "Xinware",
"email": "hudsonenglish@xinware.com",
"city": "Robbins",
"state": "ND"
}
},
{
"_index": "bank",
"_type": "_doc",
"_id": "190",
"_score": 1,
"_source": {
"account_number": 190,
"balance": 3150,
"firstname": "Blake",
"lastname": "Davidson",
"age": 30,
"gender": "F",
"address": "636 Diamond Street",
"employer": "Quantasis",
"email": "blakedavidson@quantasis.com",
"city": "Crumpler",
"state": "KY"
}
},
{
"_index": "bank",
"_type": "_doc",
"_id": "208",
"_score": 1,
"_source": {
"account_number": 208,
"balance": 40760,
"firstname": "Garcia",
"lastname": "Hess",
"age": 26,
"gender": "F",
"address": "810 Nostrand Avenue",
"employer": "Quiltigen",
"email": "garciahess@quiltigen.com",
"city": "Brooktrails",
"state": "GA"
}
},
{
"_index": "bank",
"_type": "_doc",
"_id": "222",
"_score": 1,
"_source": {
"account_number": 222,
"balance": 14764,
"firstname": "Rachelle",
"lastname": "Rice",
"age": 36,
"gender": "M",
"address": "333 Narrows Avenue",
"employer": "Enaut",
"email": "rachellerice@enaut.com",
"city": "Wright",
"state": "AZ"
}
}
]
}
}