基本概念
索引
- 索引(index)是Elasticsearch對邏輯數據的邏輯存儲,所以它可以分爲更小的部分。
- 可以把索引看成關係型數據庫的表,索引的結構是爲快速有效的全文索引準備的,特別是它不存儲原始值。
- Elasticsearch可以把索引存放在一臺機器或者分散在多臺服務器上,每個索引有一或多個分片(shard),每個
- 分片可以有多個副本(replica)。
文檔
- 存儲在Elasticsearch中的主要實體叫文檔(document)。用關係型數據庫來類比的話,一個文檔相當於數據庫表中的一行記錄。
- Elasticsearch和MongoDB中的文檔類似,都可以有不同的結構,但Elasticsearch的文檔中,相同字段必須有相同類型。
- 文檔由多個字段組成,每個字段可能多次出現在一個文檔裏,這樣的字段叫多值字段(multivalued)。
- 每個字段的類型,可以是文本、數值、日期等。字段類型也可以是複雜類型,一個字段包含其他子文檔或者數組。
映射
- 所有文檔寫進索引之前都會先進行分析,如何將輸入的文本分割爲詞條、哪些詞條又會被過濾,這種行爲叫做映射(mapping)。一般由用戶自己定義規則。
文檔類型
- 在Elasticsearch中,一個索引對象可以存儲很多不同用途的對象。例如,一個博客應用程序可以保存文章和評論。
- 每個文檔可以有不同的結構。
- 不同的文檔類型不能爲相同的屬性設置不同的類型。例如,在同一索引中的所有文檔類型中,一個叫title的字段必須具有相同的類型。
RESTful API
在Elasticsearch中,提供了功能豐富的RESTful API的操作,包括基本的CRUD、創建索引、刪除索引等操作。
創建非結構化索引
在Lucene中,創建索引是需要定義字段名稱以及字段的類型的,在Elasticsearch中提供了非結構化的索引,就是不
需要創建索引結構,即可寫入數據到索引中,實際上在Elasticsearch底層會進行結構化操作,此操作對用戶是透明
的。
創建空索引:
PUT /haoke
{
"settings": {
"index": {
"number_of_shards": "2", #分片數
"number_of_replicas": "0" #副本數
}
}
}
#刪除索引
DELETE /haoke
{
"acknowledged": true
}
插入數據
URL規則:
POST /{索引}/{類型}/{id}
POST /haoke/user/1001
#數據
{
"id":1001,
"name":"張三",
"age":20,
"sex":"男"
}
#響應
{
"_index": "haoke",
"_type": "user",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
說明:非結構化的索引,不需要事先創建,直接插入數據默認創建索引。
不指定id插入數據:
POST /haoke/user/
{
"id":1002,
"name":"張三",
"age":20,
"sex":"男"
}
更新數據
在Elasticsearch中,文檔數據是不爲修改的,但是可以通過覆蓋的方式進行更新。
PUT /haoke/user/1001
{
"id":1001,
"name":"張三",
"age":21,
"sex":"女"
}
更新結果如下:
可以看到數據已經被覆蓋了。
問題來了,可以局部更新嗎? -- 可以的。
前面不是說,文檔數據不能更新嗎? 其實是這樣的:
在內部,依然會查詢到這個文檔數據,然後進行覆蓋操作,步驟如下:
1. 從舊文檔中檢索JSON
2. 修改它
3. 刪除舊文檔
4. 索引新文檔
示例:
#注意:這裏多了_update標識
POST /haoke/user/1001/_update
{
"doc":{
"age":23
}
}
可以看到數據已經被局部更新了
刪除數據
在Elasticsearch中,刪除文檔數據,只需要發起DELETE請求即可。
DELETE /haoke/user/1001
需要注意的是,result表示已經刪除,version也更加了。
如果刪除一條不存在的數據,會響應404:
說明:
刪除一個文檔也不會立即從磁盤上移除,它只是被標記成已刪除。Elasticsearch將會在你之後添加更多索引的
時候纔會在後臺進行刪除內容的清理。
搜索數據
根據id搜索數據
GET /haoke/user/BbPe_WcB9cFOnF3uebvr
#返回的數據如下
{
"_index": "haoke",
"_type": "user",
"_id": "BbPe_WcB9cFOnF3uebvr",
"_version": 8,
"found": true,
"_source": { #原始數據在這裏
"id": 1002,
"name": "李四",
"age": 40,
"sex": "男"
}
}
搜索全部數據
GET /haoke/user/_search
響應:(默認返回10條數據)
{
"took": 26,
"timed_out": false,
"_shards": {
"total": 2,
"successful": 2,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 4,
"max_score": 1,
"hits": [
{
"_index": "haoke",
"_type": "user",
"_id": "BbPe_WcB9cFOnF3uebvr",
"_score": 1,
"_source": {
"id": 1002,
"name": "李四",
"age": 40,
"sex": "男"
}
},
{
"_index": "haoke",
"_type": "user",
"_id": "1001",
"_score": 1,
"_source": {
"id": 1001,
"name": "張三",
"age": 20,
"sex": "男"
}
},
{
"_index": "haoke",
"_type": "user",
"_id": "1003",
"_score": 1,
"_source": {
"id": 1003,
"name": "王五",
"age": 30,
"sex": "男"
}
},
{
"_index": "haoke",
"_type": "user",
"_id": "1004",
"_score": 1,
"_source": {
"id": 1004,
"name": "趙六",
"age": 30,
"sex": "男"
}
}
]
}
}
關鍵字搜素數據
#查詢年齡等於20的用戶
GET /haoke/user/_search?q=age:20
結果:
DSL搜索
Elasticsearch提供豐富且靈活的查詢語言叫做DSL查詢(Query DSL),它允許你構建更加複雜、強大的查詢。
DSL(Domain Specific Language特定領域語言)以JSON請求體的形式出現。
POST /haoke/user/_search
#請求體
{
"query" : {
"match" : { #match只是查詢的一種
"age" : 20
}
}
}
響應數據:
實現:查詢年齡大於30歲的男性用戶。
現有數據:
POST /haoke/user/_search
#請求數據
{
"query": {
"bool": {
"filter": {
"range": {
"age": {
"gt": 30
}
}
},
"must": {
"match": {
"sex": "男"
}
}
}
}
}
查詢結果:
全文搜索
POST /haoke/user/_search
#請求數據
{
"query": {
"match": {
"name": "張三 李四"
}
}
}
高亮顯示
POST /haoke/user/_search
{
"query": {
"match": {
"name": "張三 李四"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
聚合
在Elasticsearch中,支持聚合操作,類似SQL中的group by操作。
POST /haoke/user/_search
{
"aggs": {
"all_interests": {
"terms": {
"field": "age"
}
}
}
}
結果:
從結果可以看出,年齡30的有2條數據,20的有一條,40的一條。
參考文檔: