Elasticsearch是一個分布式的搜索引擎和數(shù)據(jù)分析引擎,支持全文檢索,結(jié)構(gòu)化檢索,能夠?qū)A繑?shù)據(jù)進行近實時的處理。下面是ES中的一些基本概念:
- Node: Elastic本質(zhì)上是一個分布式數(shù)據(jù)庫,允許多臺服務(wù)器協(xié)同工作。每臺服務(wù)器上可以運行一個或多個Elastic實例(一般運行一個),其中一個Elastic實例就是一個Node,多臺機器上的多個Elastic實例就構(gòu)成了一個Cluster。
- Document: 文檔,es中的最小數(shù)據(jù)單元,一個document代表了一條es中存儲的數(shù)據(jù)。例如一條商品分類數(shù)據(jù),一條訂單數(shù)據(jù),通常使用JSON數(shù)據(jù)格式表示一條Document。一條Document相當(dāng)于關(guān)系型數(shù)據(jù)庫中的一條記錄。
- Field: 一個Document里有多個field,每個field就是一個字段。例如一條商品數(shù)據(jù)就可能包含以下field: product_id,product_name,product_desc,category_id,category_name。一個Field相當(dāng)于關(guān)系型數(shù)據(jù)庫中一張表的字段。
- Index: 索引,包含一堆有相似結(jié)構(gòu)的文檔數(shù)據(jù),比如一個客戶索引,商品分類索引,訂單索引等等。一個index包含很多document,一個index就代表了一類類似的或者相同的document。比如說建立一個product index,商品索引,里面可能就存放了所有的商品數(shù)據(jù),即所有的商品document。一個index相當(dāng)于關(guān)系型數(shù)據(jù)庫中的一個database。
- Type:類型,每個索引里都可以有一個或多個type,type是index中的一個邏輯數(shù)據(jù)分類。一個type下的document,都有相同的field。比如一個博客數(shù)據(jù)index,其中可能有用戶數(shù)據(jù)type,博客數(shù)據(jù)type和評論數(shù)據(jù)type等。一個type相當(dāng)于關(guān)系型數(shù)據(jù)庫中的一張表。
- Shard: 單臺機器無法存儲大量數(shù)據(jù),es可以將一個索引中的數(shù)據(jù)切分為多個shard,分布在多臺機器上存儲。有了shard就可以橫向擴展,存儲更多數(shù)據(jù),讓搜索和分析等操作分布到多臺服務(wù)器上去執(zhí)行,提升吞吐量和性能。
- Replica: 任何一個服務(wù)器隨時可能故障或宕機,此時shard可能就會丟失,因此可以為每個shard創(chuàng)建多個replica副本。replica可以在shard故障時提供備用服務(wù),保證數(shù)據(jù)不丟失,多個replica還可以提升搜索操作的吞吐量和性能。
數(shù)據(jù)操作
新增文檔
下面的例子表示向accounts index的person type中添加一個document:
$ curl -X POST 'localhost:9200/accounts/person' -d '
{
"user": "李四",
"title": "工程師",
"desc": "系統(tǒng)管理"
}'
服務(wù)器返回的response如下:
{
"_index":"accounts",
"_type":"person",
"_id":"AV3qGfrC6jMbsbXb6k1p",
"_version":1,
"result":"created",
"_shards":{"total":2,"successful":1,"failed":0},
"created":true
}
response中包含了index名稱,type名稱,自動生成的id和shards信息等。
更新文檔
$ curl -X PUT 'localhost:9200/accounts/person/1' -d '
{
"user" : "張三",
"title" : "工程師",
"desc" : "數(shù)據(jù)庫管理,軟件開發(fā)"
}'
{
"_index":"accounts",
"_type":"person",
"_id":"1",
"_version":2,
"result":"updated",
"_shards":{"total":2,"successful":1,"failed":0},
"created":false
}
上面的例子修改了id為1的person記錄,我們將desc從“數(shù)據(jù)庫管理”修改為了“數(shù)據(jù)庫管理,軟件開發(fā)”。返回的response中,"result"從新建的"created"變?yōu)榱烁碌?updated","_version"從1變成了2,"created"字段值為false。
刪除文檔
刪除文檔就是發(fā)送DELETE請求:
$ curl -X DELETE 'localhost:9200/accounts/person/1'
Query string search
這種方法通過HTTP請求的Query String攜帶查詢參數(shù)進行查詢,適用于臨時性的查詢需求,例如:
# 檢索name中包含Java的文檔, 并按價格降序排序:
curl -XGET '[http://localhost:9301/book_shop/it_book/_search?q=name:Java&sort=price:desc](http://localhost:9301/book_shop/it_book/_search?q=name:Java&sort=price:desc)'
Query DSL
DSL: Domain Specified Language, 特定領(lǐng)域的語言, 一般需要Kibana等工具配合操作。
這種方式把查詢參數(shù)構(gòu)建成JSON格式的數(shù)據(jù), 并封裝到HTTP請求的Request Body(請求體)中, 可以構(gòu)建各類復(fù)雜的查詢語法, 功能要比Query String Search強大很多。
1. 查詢?nèi)可唐?/p>
GET book_shop/it_book/_search
{
"query": { "match_all": {} }
}
2. 查詢name中包含Java的商品,并按照price降序排序
GET book_shop/it_book/_search
{
"query": {
"match": {
"name": "Java"
}
},
"sort": [
{ "price": "desc" }
]
}
3. 分頁查詢商品,每頁顯示1條, 顯示第3頁
GET book_shop/it_book/_search
{
"query": { "match_all": {} },
"from": 2,
"size": 1
}
4. 只查詢商品的名稱和價格
GET book_shop/it_book/_search
{
"query": {"match_all": {}},
"_source": ["name", "price"]
}
5. 過濾查詢,查詢name中包含Java,且price不大于80元的商品
GET book_shop/it_book/_search
{
"query": {
"bool": {
"must": {
"match": {"name": "Java"} // name中含有Java
},
"filter": {
"range": {
"price": {"lte": 80.0} // 價格不大于80.0
}
}
}
}
}
6. 全文檢索,查詢描述信息desc中包含"Java圖書"的文檔, 并只顯示name和desc的值
GET book_shop/it_book/_search
{
"query": {
"match": {"desc": "Java圖書"}
},
"_source": ["name", "desc"]
}
返回結(jié)果如下:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 0.8630463,
"hits" : [
{
"_index" : "book_shop",
"_type" : "it_book",
"_id" : "2",
"_score" : 0.8630463,
"_source" : {
"name" : "深入理解Java虛擬機:JVM高級特性與最佳實踐",
"desc" : "Java圖書領(lǐng)域公認(rèn)的經(jīng)典著作" // desc中有"Java"和"圖書"
}
},
{
"_index" : "book_shop",
"_type" : "it_book",
"_id" : "1",
"_score" : 0.2876821,
"_source" : {
"name" : "Java編程思想(第4版)",
"desc" : "Java學(xué)習(xí)必讀經(jīng)典,殿堂級著作!" // desc中有"Java"
}
}
]
}
}