對比關系:
索引(indices)--------------------------------Databases 數據庫
類型(type)-----------------------------Table 數據表
文檔(Document)----------------Row 行
字段(Field)-------------------Columns 列
| 概念 | 說明 | | -------------------- | ------------------------------------------------------------ | | 索引庫(indices) | indices是index的復數,代表許多的索引, | | 類型(type) | 類型是模擬mysql中的table概念,一個索引庫下可以有不同類型的索引,比如商品索引,訂單索引,其數據格式不同。不過這會導致索引庫混亂,因此未來版本中會移除這個概念 | | 文檔(document) | 存入索引庫原始的數據。比如每一條商品信息,就是一個文檔 | | 字段(field) | 文檔中的屬性 | | 映射配置(mappings) | 字段的數據類型、屬性、是否索引、是否存儲等特性 | 是不是與Lucene和solr中的概念類似。 另外,在SolrCloud中,有一些集群相關的概念,在Elasticsearch也有類似的: - 索引集(Indices,index的復數):邏輯上的完整索引 collection1 - 分片(shard):數據拆分后的各個部分 - 副本(replica):每個分片的復制 要注意的是:Elasticsearch本身就是分布式的,因此即便你只有一個節點,Elasticsearch默認也會對你的數據進行分片和副本操作,當你向集群添加新數據時,數據也會在新加入的節點中進行平衡。
Elasticsearch采用Rest風格API,因此其API就是一次http請求,你可以用任何工具發起http請求
創建索引
創建索引的請求格式: - 請求方式:PUT - 請求路徑:/索引庫名 - 請求參數:json格式: { "settings": { "number_of_shards": 3, "number_of_replicas": 2 } } - settings:索引庫的設置 - number_of_shards:分片數量 - number_of_replicas:副本數量
查看索引
GET /索引庫名
可以使用*來查詢所有索引庫配置
刪除索引
DELETE /索引庫名
可以用HEAD請求,查看索引是否存在:
配置映射
什么是映射?
映射是定義文檔的過程,文檔包含哪些字段,這些字段是否保存,是否索引,是否分詞等
只有配置清楚,Elasticsearch才會幫我們進行索引庫的創建(不一定)
PUT /索引庫名/_mapping/類型名稱 { "properties": { "字段名": { "type": "類型", "index": true, "store": true, "analyzer": "分詞器" } } }
-
-
type:類型,可以是text、long、short、date、integer、object等
-
index:是否索引,默認為true
-
store:是否存儲,默認為false
-
analyzer:分詞器,這里的
ik_max_word
示例
PUT test/_mapping/goods { "properties": { "title": { "type": "text", "analyzer": "ik_max_word" }, "images": { "type": "keyword", "index": "false" }, "price": { "type": "float" } } }
響應結果
{ "acknowledged": true }
GET /索引庫名/_mapping
示例
GET /test/_mapping
響應
{ "heima": { "mappings": { "goods": { "properties": { "images": { "type": "keyword", "index": false }, "price": { "type": "float" }, "title": { "type": "text", "analyzer": "ik_max_word" } } } } } }
-
-
text:可分詞,不可參與聚合
-
keyword:不可分詞,數據會作為完整字段進行匹配,可以參與聚合
-
-
Numerical:數值類型,分兩類
-
基本數據類型:long、interger、short、byte、double、float、half_float
-
浮點數的高精度類型:scaled_float
-
需要指定一個精度因子,比如10或100。elasticsearch會把真實值乘以這個因子后存儲,取出時再還原。
-
-
-
Date:日期類型
index影響字段的索引情況。
-
true:字段會被索引,則可以用來進行搜索。默認值就是true
-
false:字段不會被索引,不能用來搜索
index的默認值就是true,也就是說你不進行任何配置,所有字段都會被索引。
但是有些字段是我們不希望被索引的,比如商品的圖片信息,就需要手動設置index為false。
store
是否將數據進行額外存儲。
在學習lucene和solr時,我們知道如果一個字段的store設置為false,那么在文檔列表中就不會有這個字段的值,用戶的搜索結果中不會顯示出來。
但是在Elasticsearch中,即便store設置為false,也可以搜索到結果。
原因是Elasticsearch在創建文檔索引時,會將文檔中的原始數據備份,保存到一個叫做_source
的屬性中。而且我們可以通過過濾_source
來選擇哪些要顯示,哪些不顯示。
而如果設置store為true,就會在_source
以外額外存儲一份數據,多余,因此一般我們都會將store設置為false,事實上,store的默認值就是false。
boost
POST /索引庫名/類型名 { "key":"value" }
示例
POST /test/goods/ { "title":"錘子手機", "images":"http://image.test.com/12479122.jpg", "price":2699.00 }
響應
{ "_index": "test", "_type": "goods", "_id": "r9c1KGMBIhaxtY5rlRKv", "_version": 1, "result": "created", "_shards": { "total": 3, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 2 }
查看數據
get _search { "query":{ "match_all":{} } }
{ "_index": "heima", "_type": "goods", "_id": "r9c1KGMBIhaxtY5rlRKv", "_version": 1, "_score": 1, "_source": { "title": "錘子手機", "images": "http://image.test.com/12479122.jpg", "price": 2699 } }
-
-
_id
POST /索引庫名/類型/id值
{
...
}
示例
POST /test/goods/2 { "title":"華為手機", "images":"http://image.test.com/12479122.jpg", "price":2899.00 }
Solr中,在新增數據時,只能使用提前配置好映射屬性的字段,否則就會報錯。
不過在Elasticsearch中並沒有這樣的規定。
事實上Elasticsearch非常智能,你不需要給索引庫設置任何mapping映射,它也可以根據你輸入的數據來判斷類型,動態添加數據映射。
POST /test/goods/3 { "title":"超米手機", "images":"http://image.test.com/12479122.jpg", "price":2899.00, "stock": 200, //新增的未配置映射的字段 "saleable":true //新增的未配置映射的字段
}
請求方式改為PUT,就是修改了。不過修改必須指定id,
-
id對應文檔存在,則修改
-
PUT /test/goods/3 { "title":"蘋果手機", "images":"http://image.test.com/12479122.jpg", "price":3899.00, "stock": 100, "saleable":true }
DELETE /索引庫名/類型名/id值