操作索引
1.1.基本概念
Elasticsearch也是基於Lucene的全文檢索庫,本質也是存儲數據,很多概念與MySQL類似的。
對比關係:
索引(indices)--------------------------------Databases 數據庫
類型(type)-----------------------------Table 數據表
文檔(Document)----------------Row 行
字段(Field)-------------------Columns 列
詳細說明:
概念 | 說明 |
---|---|
索引庫(indices) | indices是index的複數,代表許多的索引, |
類型(type) | 類型是模擬mysql中的table概念,一個索引庫下可以有不同類型的索引,比如商品索引,訂單索引,其數據格式不同。不過這會導致索引庫混亂,因此未來版本中會移除這個概念 |
文檔(document) | 存入索引庫原始的數據。比如每一條商品信息,就是一個文檔 |
字段(field) | 文檔中的屬性 |
映射配置(mappings) | 字段的數據類型、屬性、是否索引、是否存儲等特性 |
是不是與Lucene和solr中的概念類似。
另外,在SolrCloud中,有一些集羣相關的概念,在Elasticsearch也有類似的:
- 索引集(Indices,index的複數):邏輯上的完整索引
- 分片(shard):數據拆分後的各個部分
- 副本(replica):每個分片的複製
要注意的是:Elasticsearch本身就是分佈式的,因此即便你只有一個節點,Elasticsearch默認也會對你的數據進行分片和副本操作,當你向集羣添加新數據時,數據也會在新加入的節點中進行平衡。
1.2.創建索引
1.2.1.語法
Elasticsearch採用Rest風格API,因此其API就是一次http請求,你可以用任何工具發起http請求
創建索引的請求格式:
-
請求方式:PUT
-
請求路徑:/索引庫名
-
請求參數:json格式:
{ "settings": { "number_of_shards": 3, "number_of_replicas": 2 } }
- settings:索引庫的設置
- number_of_shards:分片數量
- number_of_replicas:副本數量
- settings:索引庫的設置
1.2.2.使用kibana創建
kibana的控制檯,可以對http請求進行簡化,示例:
相當於是省去了elasticsearch的服務器地址
而且還有語法提示,非常舒服。
1.3.查看索引設置
語法
Get請求可以幫我們查看索引信息,格式:
GET /索引庫名
或者,我們可以使用*來查詢所有索引庫配置:
1.4.刪除索引
刪除索引使用DELETE請求
語法
DELETE /索引庫名
示例
再次查看xiaoge:
當然,我們也可以用HEAD請求,查看索引是否存在:
1.5.映射配置
索引有了,接下來肯定是添加數據。但是,在添加數據之前必須定義映射。
什麼是映射?
映射是定義文檔的過程,文檔包含哪些字段,這些字段是否保存,是否索引,是否分詞等
只有配置清楚,Elasticsearch纔會幫我們進行索引庫的創建(不一定)
1.5.1.創建映射字段
語法
請求方式依然是PUT
PUT /索引庫名/_mapping/類型名稱
{
"properties": {
"字段名": {
"type": "類型",
"index": true,
"store": true,
"analyzer": "分詞器"
}
}
}
- 類型名稱:就是前面將的type的概念,類似於數據庫中的不同表
字段名:任意填寫 ,可以指定許多屬性,例如: - type:類型,可以是text、long、short、date、integer、object等
- index:是否索引,默認爲true
- store:是否存儲,默認爲false
- analyzer:分詞器,這裏的
ik_max_word
即使用ik分詞器
示例
發起請求:
PUT xiaoge/_mapping/goods
{
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word"
},
"images": {
"type": "keyword",
"index": "false"
},
"price": {
"type": "float"
}
}
}
響應結果:
{
"acknowledged": true
}
1.5.2.查看映射關係
語法:
GET /索引庫名/_mapping
示例:
GET /xiaoge/_mapping
響應:
{
"xiaoge": {
"mappings": {
"goods": {
"properties": {
"images": {
"type": "keyword",
"index": false
},
"price": {
"type": "float"
},
"title": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
}
1.5.3.字段屬性詳解
1.5.3.1.type
Elasticsearch中支持的數據類型非常豐富:
常用類型:
-
String類型,又分兩種:
- text:可分詞,不可參與聚合
- keyword:不可分詞,數據會作爲完整字段進行匹配,可以參與聚合
-
Numerical:數值類型,分兩類
- 基本數據類型:long、interger、short、byte、double、float、half_float
- 浮點數的高精度類型:scaled_float
- 需要指定一個精度因子,比如10或100。elasticsearch會把真實值乘以這個因子後存儲,取出時再還原。
-
Date:日期類型
elasticsearch可以對日期格式化爲字符串存儲,但是建議我們存儲爲毫秒值,存儲爲long,節省空間。
1.5.3.2.index
index影響字段的索引情況。
- true:字段會被索引,則可以用來進行搜索。默認值就是true
- false:字段不會被索引,不能用來搜索
index的默認值就是true,也就是說你不進行任何配置,所有字段都會被索引。
但是有些字段是我們不希望被索引的,比如商品的圖片信息,就需要手動設置index爲false。
1.5.3.3.store
是否將數據進行額外存儲。
在學習lucene和solr時,我們知道如果一個字段的store設置爲false,那麼在文檔列表中就不會有這個字段的值,用戶的搜索結果中不會顯示出來。
但是在Elasticsearch中,即便store設置爲false,也可以搜索到結果。
原因是Elasticsearch在創建文檔索引時,會將文檔中的原始數據備份,保存到一個叫做_source
的屬性中。而且我們可以通過過濾_source
來選擇哪些要顯示,哪些不顯示。
而如果設置store爲true,就會在_source
以外額外存儲一份數據,多餘,因此一般我們都會將store設置爲false,事實上,store的默認值就是false。
1.5.3.4.boost
激勵因子,這個與lucene中一樣
官方文檔:
1.6.新增數據
1.6.1.隨機生成id
通過POST請求,可以向一個已經存在的索引庫中添加數據。
語法:
POST /索引庫名/類型名
{
"key":"value"
}
示例:
POST /xiaoge/goods/
{
"title":"小米手機",
"images":"http://image.leyou.com/12479122.jpg",
"price":2699.00
}
響應:
{
"_index": "xiaoge",
"_type": "goods",
"_id": "qTzaknIByWDXgR99S9FK",
"_version": 1,
"result": "created",
"_shards": {
"total": 3,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
通過kibana查看數據:
GET _search
{
"query":{
"match_all":{}
}
}
{
"_index": "xiaoge",
"_type": "goods",
"_id": "qTzaknIByWDXgR99S9FK",
"_score": 1,
"_source": {
"title": "小米手機",
"images": "http://image.leyou.com/12479122.jpg",
"price": 2699
}
}
_source
:源文檔信息,所有的數據都在裏面。_id
:這條文檔的唯一標示,與文檔自己的id字段沒有關聯
1.6.2.自定義id
如果我們想要自己新增的時候指定id,可以這麼做:
POST /索引庫名/類型/id值
{
...
}
示例:
POST /xiaoge/goods/2
{
"title":"大米手機",
"images":"http://image.leyou.com/12479122.jpg",
"price":2899.00
}
得到的數據:
GET /xiaoge/goods/2
{
"_index": "xiaoge",
"_type": "goods",
"_id": "2",
"_version": 1,
"found": true,
"_source": {
"title": "大米手機",
"images": "http://image.leyou.com/12479122.jpg",
"price": 2899
}
}
1.6.3.智能判斷
在Solr中,新增數據時,只能使用提前配置好映射屬性的字段,否則就會報錯。
不過在Elasticsearch中並沒有這樣的規定。
事實上Elasticsearch非常智能,你不需要給索引庫設置任何mapping映射,它也可以根據你輸入的數據來判斷類型,動態添加數據映射。
測試一下:
POST /xiaoge/goods/3
{
"title":"超米手機",
"images":"http://image.leyou.com/12479122.jpg",
"price":2899.00,
"stock": 200,
"saleable":true
}
我們額外添加了stock庫存,和saleable是否上架兩個字段。
來看結果:
GET /xiaoge/goods/3
{
"_index": "xiaoge",
"_type": "goods",
"_id": "3",
"_version": 1,
"found": true,
"_source": {
"title": "超米手機",
"images": "http://image.leyou.com/12479122.jpg",
"price": 2899,
"stock": 200,
"saleable": true
}
}
在看下索引庫的映射關係:
GET /xiaoge/_mapping
{
"xiaoge": {
"mappings": {
"goods": {
"properties": {
"images": {
"type": "keyword",
"index": false
},
"price": {
"type": "float"
},
"saleable": {
"type": "boolean"
},
"stock": {
"type": "long"
},
"title": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
}
stock和saleable都被成功映射了。
1.7.修改數據
把剛纔新增的請求方式改爲PUT,就是修改了。不過修改必須指定id,
- id對應文檔存在,則修改
- id對應文檔不存在,則新增
比如,我們把id爲3的數據進行修改:
PUT /xiaoge/goods/3
{
"title":"超大米手機",
"images":"http://image.leyou.com/12479122.jpg",
"price":3899.00,
"stock": 100,
"saleable":true
}
結果:
GET /xiaoge/_search
{
"query": {
"match": {
"_id": "3"
}
}
}
{
"took": 35,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "xiaoge",
"_type": "goods",
"_id": "3",
"_score": 1,
"_source": {
"title": "超大米手機",
"images": "http://image.leyou.com/12479122.jpg",
"price": 3899,
"stock": 100,
"saleable": true
}
}
]
}
}
1.8.刪除數據
刪除使用DELETE請求,同樣,需要根據id進行刪除:
語法
DELETE /索引庫名/類型名/id值
示例: