作者 | 蔡柱梁
審校 | 重樓
目錄
- ES是什么
- 倒排索引
- 使用ES必須知道的基本概念
- 了解常用的DSL
1 ES是什么
Elasticsearch 是一個分布式的 RESTful 搜索和分析引擎,可用來集中存儲您的數據,以便您對形形色色、規模不一的數據進行搜索、索引和分析。上面是??官網-API文檔??對的定位描述。ES 是一個分布式的搜索引擎,數據存儲形式與我們常用的 MySQL 的存儲形式 — rows 不同,ES 會將數據以 JSON 結構存儲到一個文檔。一個文檔寫入 ES 后,我們可以在 1 秒左右查詢到它,因此我們稱 ES 在分布式中數據查詢是準實時的。
提問:那么這種將一行行數據變成
我們傳統的關系型數據庫一般的存儲形式是數據結構不固定,長度不固定。這時如果用關系型數據庫做存儲,那么我們表設計上,只能用一個為了可以適應高并發,又能快速檢索、分析數據的搜索分析引擎,像倒排索引實現可以通過詞條快速查找文檔的,而倒排索引的實現與這種文檔存儲數據的方式密不可分。
ES 的適用場景所具有的特點:
- 海量數據的搜索服務
- 對實時性要求較高
- 對事務要求不高
2 倒排索引
倒排索引是文檔檢索系統中最常用的數據結構。說到幫助搜索引擎檢索數據的數據結構,我們最熟悉的應該就是倒排索引了。過去很多人喜歡用字典來舉例,因為它的原理和我們使用中文字典查找漢字是相似的。
ES 會在我們保存一份文檔的時候,將文檔根據指定分詞器進行分詞,然后維護關鍵詞和文檔的關系——倒排索引。后面我們通過一些詞條進行檢索的時候,就可以通過這個索引找到對應相關的文檔。
2.1 例子
下面舉個例子。插入兩份文檔,內容如下:
- we like JAVA java java
- we like lucene lucene lucene
- 首先對所有數據的內容進行拆分,拆分成唯一的一個個詞語(詞條)
- 然后建立詞條和對應文檔的對應關系,具體如下:
詞條? | (文檔ID,頻率)? | 詞條在文檔中的位置? |
we | (1,1) (2,1) | (0) (0) |
like | (1,1) (2,1) | (1) (1) |
java | (1,3) | (2,3,4) |
lucene | (2,3) | (2,3,4) |
那這時我檢索詞條:
3 使用ES必須知道的基本概念
這里的概念是我們在使用過程中絕對無法繞開的概念,所以我們需要知道,否則無法和同事交流,哪怕僅僅是使用級別。3.1 document(文檔)
在 ES 中,一份文檔相當于 MySQL 中的一行記錄,數據以 JSON 格式保存。文檔被更新時,版本號會被增加。3.2 Index(索引)
存儲文檔的地方,類似 MySQL 中的表。3.3 MApping(映射)
映射是定義一個文件和它所包含的字段如何被存儲和索引的過程(??這是官方定義??)。文檔里面有許多字段,這些字段有自己的類型,采用什么分詞器等等,我們可以通過。
3.4 type(類型)
這是比較老舊版本會用到的定義,在 ES5 的時代,它可以對 Index 做更精細地劃分,那個時代的 Index 更像 MySQL 的實例,而 type 類似 MySQL 的 table。ES 5.x 中一個index可以有多種type。
ES 6.x 中一個index只能有一種type。
ES 7.x 以后,將逐步移除type這個概念,現在的操作已經不再使用,默認_doc。
4 了解常用的DSL
在 MySQL 中,我們經常使用 SQL 通過客戶端操作 MySQL,而 DSL 正是我們通過客戶端發送給 ES 的操作指令。下面只寫一些現在我們常常接觸的簡單的 DSL,更多的請看 官網。
4.1 Index
官網API:??https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html??4.1.1 創建索引
可以先建索引,再設置 mapping,也可以直接一次完成。一次建好
PUT goods{
"mappings": {
"properties": {
"brand": {
"type": "keyword"
},
"category": {
"type": "keyword"
},
"num": {
"type": "integer"
},
"price": {
"type": "double"
},
"title": {
"type": "text",
"analyzer": "ik_smart"
},
"id": {
"type": "long"
}
}
}
}