電商網站商品管理(一)
面向文檔的搜索分析引擎
(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" } } } } } } } }
電商網站商品管理(一)