ES中有一些名詞與非關係型數據庫很類似,因爲平常接觸關係型數據庫比較多,就來對比一下關係型數據庫和ES的名詞的含義:
ElasticSearch | 關係型數據庫 |
---|---|
索引Index | 數據庫database |
類型Type | 表table |
文檔document | 行Row |
屬性Field | 列column |
一個 Elasticsearch 集羣可以 包含多個 索引 ,相應的每個索引可以包含多個 類型 。 這些不同的類型存儲着多個 文檔 ,每個文檔又有 多個 屬性 。
增加
PUT /retail/car/1
{
"uid": "X0Mtlfa5iB",
"spu_id": "127",
"surface_color": "#D7361C",
"surface_color_name": "熔岩橙",
"inner_color": "#000000",
"inner_color_name": "黑色",
"delete_mark": "0"
}
retail爲elasticSearch中的一個索引,car爲索引中的一個類型,1爲插入的文檔的id。插入的文檔具體信息如請求體所示。
創建成功:
查詢
GET retail/car/_search;
如果需要查詢特定的字段(比如uid和surface_color_name)
GET new_retail/spu/1?_source=uid,surface_color_name;
如果只需要返回_source字段,不需要任何元數據:
GET new_retail/spu/1/_source;
返回插入的文檔信息:
{
"_index": "retail",
"_type": "car",
"_id": "1",
"_version": 2,
"found": true,
"_source": {
"uid": "X0Mtlfa5iB",
"spu_id": "127",
"surface_color": "#D7361C",
"surface_color_name": "熔岩橙",
"inner_color": "#000000",
"inner_color_name": "黑色",
"delete_mark": "0"
}
}
ES Restful API GET、POST、PUT、DELETE、HEAD含義:
1)GET:獲取請求對象的當前狀態。
2)POST:改變對象的當前狀態。
3)PUT:創建一個對象。
4)DELETE:銷燬對象。
5)HEAD:請求獲取對象的基礎信息。
接下來,嘗試查詢外觀顏色(surface_color_name)包含黑色的記錄。
方法一:在請求路徑中使用 _search
端點(後文解釋),並將查詢本身賦值給參數 q=。
GET retail/car/_search?q=uid:vHK2lW0NHq
方法二:使用match查詢(查詢方法之一,後文解釋),使用請求體代替query-string參數。
GET retail/car/_search
{
"query":{
"match":{
"surface_color_name":"黑色"
}
}
}
(注意:使用head插件進行查詢時,需要將方法改爲POST,GET是不生效的)
再來看看稍微複雜一些的搜索:
在搜索外觀顏色的基礎上,查詢spu_id小於130的記錄。
GET retail/car/_search{
"query":{
"bool":{
"must":{
"match":{"surface_color_name":"黑色"}
},
"filter":{
"range":{"spu_id":{"lt":132}}
}
}
}
}
其中包括一個range過濾器,其中lt同HTML中的標籤表示小於。
得到兩個匹配值:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.68324494,
"hits": [
{
"_index": "retail",
"_type": "car",
"_id": "3",
"_score": 0.68324494,
"_source": {
"uid": "V6uKDzn3MA",
"spu_id": "132",
"surface_color": "#0000FF #000000",
"surface_color_name": "藍色 黑色",
"inner_color": "#000000 #FFFFFF",
"inner_color_name": "黑色 白色",
"delete_mark": "0"
}
},
{
"_index": "retail",
"_type": "car",
"_id": "2",
"_score": 0.2876821,
"_source": {
"uid": "vHK2lW0NHq",
"spu_id": "131",
"surface_color": "#0000FF",
"surface_color_name": "藍色",
"inner_color": "#000000",
"inner_color_name": "黑色",
"delete_mark": "0"
}
}]
}
}
其中"_score": 0.68324494 表示相關性得分,將會返回inner_color_name包含黑色、黑、色的所有記錄,只是包含黑、色的記錄相關性得分低於黑色記錄。
(短語搜索:如果需要查找同時包含黑色短語的記錄,需要使用match_phrase關鍵字代替match)
高亮搜索:
GET retail/car/_search{
"query": {
"match":{
"surface_color_name":"黑色"
}
},
"highlight":{
"fields":{
"surface_color_name":{}
}
}
}
返回值多了一條高亮,其中使用<em>標籤封裝匹配的文本字段:
"highlight": { "surface_color_name": [ "<em>黑</em><em>色</em> 藍<em>色</em>" ] }
聚合(aggregations):
如下爲一個簡單的統計,統計surface_color_name中的個數。
GET retail/car/_search{
"aggs":{
"all_color":{
"terms":{"field":"surface_color_name"}
}
}
}