環境:elasticsearch6.1.2 kibana6.1.2 基礎概念: 1、_index元數據 (1)代表一個document存放在哪個index中(2)類似的數據放在一個索引,非類似的數據放不同索引:product index(包含了所有的商品),sales index(包含了所有的商品銷 ...
環境:elasticsearch6.1.2 kibana6.1.2
基礎概念:
1、_index元數據
(1)代表一個document存放在哪個index中
(2)類似的數據放在一個索引,非類似的數據放不同索引:product index(包含了所有的商品),sales index(包含了所有的商品銷售數據),inventory index(包含了所有庫存相關的數據)。如果你把比如product,sales,human resource(employee),全都放在一個大的index裡面,比如說company index,不合適的。
(3)index中包含了很多類似的document:類似是什麼意思,其實指的就是說,這些document的fields很大一部分是相同的,你說你放了3個document,每個document的fields都完全不一樣,這就不是類似了,就不太適合放到一個index裡面去了。
(4)索引名稱必須是小寫的,不能用下劃線開頭,不能包含逗號。
2、_type元數據
(1)代表document屬於index中的哪個類別(type)
(2)一個索引通常會劃分為多個type,邏輯上對index中有些許不同的幾類數據進行分類:因為一批相同的數據,可能有很多相同的fields,但是還是可能會有一些輕微的不同,可能會有少數fields是不一樣的,舉個例子,就比如說,商品,可能劃分為電子商品,生鮮商品,日化商品,等等。
(3)type名稱可以是大寫或者小寫,但是同時不能用下劃線開頭,不能包含逗號
3、_id元數據
(1)代表document的唯一標識,與index和type一起,可以唯一標識和定位一個document
(2)我們可以手動指定document的id(put /index/type/id),也可以不指定,由es自動為我們創建一個id
一、插入
數據準備(插入):es會自動建立index和type,不需要提前創建,而且es預設會對document每個field都建立倒排索引,讓其可以被搜索。
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" : "youxiao 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" ] }
插入數據時的id生成策略:
手動指定document id:當es的數據來源於其他系統,比如mysql而這些數據都有主鍵ID,建議使用該方式,可以直接將mysql的主鍵作為es中的ID。
自動生成的id:當我們的數據是直接存儲到es中時,建議採用該方式。該方式的特點,長度為20個字元,URL安全,base64編碼,GUID,分散式系統並行生成時不可能會發生衝突。
POST /test_index/test_type { "test_content": "my test" }
結果: { "_index": "test_index", "_type": "test_type", "_id": "fkSoJ2EBuYE9HLKhxglD", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1 }
二、修改
1、document的全量替換型修改:該方式是直接替換類型是 product id=1的文檔。該方式必須帶上所有的field,才能去進行信息的修改。
PUT /ecommerce/product/1 { "name" : "jiaqiangban gaolujie yagao", "desc" : "gaoxiao meibai", "price" : 30, "producer" : "gaolujie producer", "tags": [ "meibai", "fangzhu" ] }
註意:
1、document的全量替換
(1)語法與創建文檔是一樣的,如果document id不存在,那麼就是創建;如果document id已經存在,那麼就是全量替換操作,替換document的json串內容
(2)document是不可變的,如果要修改document的內容,第一種方式就是全量替換,直接對document重新建立索引,替換裡面所有的內容
(3)es會將老的document標記為deleted,然後新增我們給定的一個document,當我們創建越來越多的document的時候,es會在適當的時機在後臺啟動線程刪除標記為deleted的document,釋放空間。
2、指定修改內容修改(推薦該方式)
POST /ecommerce/product/1/_update { "doc": { "name": "jiaqiangban gaolujie yagao" } }
三、刪除
根據類型的Id直接刪除
DELETE /ecommerce/product/1
註意: 不是物理刪除,只會將其標記為deleted,當數據越來越多的時候,在後臺啟動線程自動刪除,釋放空間。
四、查詢
(一)、query string search
什麼是query string search:search參數都是以http請求的query string來附帶的
demo:
1、搜索全部商品:
GET /ecommerce/product/_search
{
}
結果分析:
took:耗費了幾毫秒
timed_out:是否超時,這裡是沒有
_shards:數據拆成了5個分片,所以對於搜索請求,會打到所有的primary shard(或者是它的某個replica shard也可以)
hits.total:查詢結果的數量,3個document
hits.max_score:score的含義,就是document對於一個search的相關度的匹配分數,越相關,就越匹配,分數也高
hits.hits:包含了匹配搜索的document的詳細數據
2、搜索商品名稱中包含yagao的商品,並按照價格倒序:
GET /ecommerce/product/_search?q=name:yagao&sort=price:desc
{
}
(二)、query DSL
DSL:Domain Specified Language,特定領域的語言
http request body:請求體,可以用json的格式來構建查詢語法,比較方便,可以構建各種複雜的語法。
1、分頁查詢所有商品並按照價格倒序
GET /ecommerce/product/_search { "query": { "match_all": {} }, "sort": [ { "price": "desc" } ], "from": 0, "size": 3 }
query:包裝查詢條件
sort:包裝排序條件
form:第幾頁
size:每頁幾條
2、根據名稱查詢,並按照價格倒序
GET /ecommerce/product/_search { "query": { "match": { "name":"yagao" } }, "sort": [ { "price": "desc" } ] }
3、指定返回結果的列(field)
GET /ecommerce/product/_search { "query": { "match_all": {} }, "_source": ["name", "price"] }
_source元數據:就是說,我們在創建一個document的時候,使用的那個放在request body中的json串,預設情況下,在get的時候,會原封不動的給我們返回回來。我們可以指定_source中,返回哪些field。
(三)、query filter
1、搜索商品名稱包含yagao,而且售價大於25元的商品
GET /ecommerce/product/_search { "query" : { "bool" : { "must" : { "match" : { "name" : "yagao" } }, "filter" : { "range" : { "price" : { "gt" : 25 } } } } } }
(四)full-text search (全文檢索)
全文檢索會將輸入的搜索串拆解開來,去倒排索引裡面去一一匹配,只要能匹配上任意一個拆解後的單詞,就可以作為結果返回。
1、根據一段文字進行查找
GET /ecommerce/product/_search { "query" : { "match" : { "producer" : "yagao producer" } } }
producer這個欄位,會先被拆解,建立倒排索引。根據es中這個欄位的所有數據分詞後有 jiajieshi、gaolujie、zhonghua、producer
查詢條件producer 也會被分詞 ,分詞為 yagao 和 producer
結果分析: "max_score": 0.2876821 匹配度
(五)、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" : {} } } }