1. 程式人生 > >電商網站商品管理(一)

電商網站商品管理(一)

ja

1、document數據格式

面向文檔的搜索分析引擎

(1)應用系統的數據結構都是面向對象的

(2)對象數據存儲到數據庫中,只能拆解,變為多張表,查詢的時候還要還原為對象格式

(3)ES是面向文檔的,與面向對象的數據結構一樣,基於文檔的數據結構,es可以提供復雜的索引、全文檢索、分析聚合等功能


{
 "email":"[email protected]",
 "first_name":"san",
 "last_name":"zhang",
 "info"{
        "bio":"curison and modest",
"age":30,
"interests":["bike","climb"]
   },
  "join_date":"2017-01-01"
}



2、電商網站商品管理案例背景介紹

(1) 對商品信息進行CRUD(增刪改查)

(2)執行簡單的結構化查詢

(3)可以執行簡單的全文檢索,以及復雜的phrase(短語)檢索

(4)對於全文檢索的結構,可以進行高亮顯示

(5)對數據進行簡單的聚合分析


3、簡單的集群管理

(1)快速檢查集群的健康狀況

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

1525610669 20:44:29 elasticsearch green 1 1 0 0 0 0 0 0 - 100.0%



如何快速了解集群的健康狀況?green、yellow、red?

green:每個索引的primary shared和replica shared都是active狀態的

yellow:每個索引的primary shared都是active的,部分replica shared不是active

red:不是索引的primary shared都是active的,部分索引數據丟失的


(2)快速查看集群中有哪些索引?

get _cat/indices?v


(3)簡單的索引操作

創建索引:PUT /test_index?pretty

刪除索引:delete /test_index?pretty



4、商品的CRUD操作

(1)新增商品:新建文檔、建立索引

PUT /index/type/id

PUT /ecommerce/product/1
{ "name":"gaolujie yagao",
   "desc":"gaoxiao meibai",
   "price":30,
   "producer":"gaolujie producer",
   "tags":["meibai","fangzhu"]
}
PUT /ecommerce/product/2
{ "name":"jiajieshi yagao",
   "desc":"gaoxiao fangzhu",
   "price":25,
   "producer":"jiajieshi producer",
   "tags":["fangzhu"]
}
PUT /ecommerce/product/3
{ "name":"zhonghua yagao",
   "desc":"caoben zhiwu",
   "price":40,
   "producer":"zhonghua producer",
   "tags":["qingxin"]
}

返回結果:

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

ES會自動建立index和type,不需要提前創建,而且ES默認會對document每個field都建立倒排索引,讓其可以被搜索




(2)查詢商品,檢索文檔

GET /index/type/id

GET /ecommerce/product/2


(3)修改商品,替換文檔

PUT /ecommerce/product/1
{ "name":"jiaqiangban gaolujie yagao",
   "desc":"gaoxiao meibai",
   "price":30,
   "producer":"gaolujie producer"
   "tags":["meibai","fangzhu"]
}

替換方式有一個不好的地方,必須帶上所有的field,才能去進行信息修改,否則會丟失數據

(4)修改商品,更新文檔

 POST /ecommerce/product/1/_update
  {
    "doc":{
    "name":"jiaqiangban gaolujie yagao"
  }
  }

(5)刪除文檔

 delete /ecommerce/product/1?pretty


二、ES的查詢語法

1、query string search

 GET /ecommerce/product/_search  
 GET /ecommerce/product/_search?q=name:yagao&sort=price:desc


{
  "took": 54,  耗費的毫秒數
  "timed_out": false, 是否超時
  "_shards": {  
    "total": 5,  數據被拆成5個分片
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  hits": {
    "total": 3,  查詢結果的數量,3個document
    "max_score": 1,search的相關度,越相關,就越匹配,分數就越高
    "hits":包含了搜索的document的詳細數據


2、query DSl 特定領域的語言

GET /ecommerce/product/_search
 {
  "query":{"match_all": {}}
 }

  • 查詢名稱包含yagao的商品,同時按照價格降序排序

 GET /ecommerce/product/_search
 {
  "query":{"match": {"name": "yagao"}}
  ,
  "sort": [
    {"price": "desc"}
  ]
 }


  • 分頁查詢

GET /ecommerce/product/_search
 {
  "query":{"match_all": {}},
  "from": 1,
  "size":1
 }
  • 指定要查詢商品的名稱和價格就可以了

GET /ecommerce/product/_search
 {
  "query":{"match_all": {}},
   "_source": ["name","price"]
 }

  • query filter

搜索商品名稱包含牙膏,而且售價大於25元的商品

GET /ecommerce/product/_search
 {
  "query": {
    
    "bool": {
      
      "must": [
        {"match": {
          "name": "yagao"
        }}
      ],"filter": {"range": {
        "price": {
          "gte": 30
        }
      }}
    }
  }
 }


  • full-text search


PUT /ecommerce/product/4
{ "name":"special yagao",
   "desc":"special meibai",
   "price":50,
   "producer":"special yagao producer",
   "tags":["meibai"]
}



GET /ecommerce/product/_search
{
  "query": {"match": {
    "producer": "yagao producer"
  }}
}
  • phrase search

跟全文索引相對應,全文索引會將輸入的搜索串拆解開來,去倒排索引裏面一一匹配,只要匹配上任意一個拆解後的單詞,就可以作為結果返回,phrase search要求輸入的搜索串,必須在指定的字段文本中,完全包含一模一樣的,才算匹配

GET /ecommerce/product/_search
{
  "query": {"match_phrase": {
    "producer": "yagao producer"
  }}
}


  • highlight search

GET /ecommerce/product/_search
{
  "query": {"match": {
    "producer": "producer"
  }},
  "highlight": {"fields": {
    
    "producer": {}
  }}
}


三、使用restful api做簡單的聚合計算


  • 計算每個tag下的商品數量


GET /ecommerce/product/_search
{
  "aggs": {
    "group_by_tags": {
      "terms": {
        "field": "tags"
      }
    }
  }
}


  • 將文本field的fieldata屬性設置為TRUE


put /ecommerce/_mapping/product
{
"properties":{
  "tags":{
    "type":"text",
    "fielddata":true
  }
}
}



GET /ecommerce/product/_search
{
  "size":0,
  "aggs": {
    "group_by_tags": {
      "terms": {
        "field": "tags"
      }
    }
  }
}



  • 對名稱中包含yagao的商品,計算每個tag下的商品數量


GET /ecommerce/product/_search
{
  "size":0,
  "query": {"match": {
    "name": "yagao"
  }}, 
  "aggs": {
    "group_by_tags": {
      "terms": {
        "field": "tags"
      }
    }
  }
}



  • 先分組,在算每組的平均值,計算每個tag下的商品的平均價格


GET /ecommerce/product/_search
{
  "size":0,
  "aggs": {
    "group_by_tags": {
      "terms": {
        "field": "tags"
      },
      "aggs": {
        "avg_price": {
          "avg": {
          "field": "price"
          }
        }
      }
    }
  }
}


  • 計算每個tag下的商品的平均價格,並降序排序

GET /ecommerce/product/_search
{
  "size":0,
  "aggs": {
    "group_by_tags": {
      "terms": {
        "field": "tags",
        "order": {
          "avg_price": "desc"
        }
      },
      "aggs": {
        "avg_price": {
          "avg": {
          "field": "price"
          }
        }
      }
    }
  }
}



  • 按照指定的價格範圍區間進行分組,然後在每組內再安裝tag進行分組,最後在計算每組的平均價格

GET /ecommerce/product/_search
{
  "size":0,
  "aggs": {
    "group_by_price": {
      "range": {
        "field": "price",
        "ranges": [{
          "from": "0",
          "to":20
        },
        {
          "from": "20",
          "to":40
        },
         {
          "from": "40",
          "to":60
        }
        
        ]
      },
      "aggs": {
        "group_by_tags": {
         "terms": {
           "field": "tags"
         },
         "aggs": {
           "avg_price": {
             "avg": {
               "field": "price"
             }
           }
         }
        }
      }
    }
  }
}


電商網站商品管理(一)