一、前文介紹
Elasticsearch(簡稱ES)是一個基於Apache Lucene(TM)的開源搜索引擎,無論在開源還是專有領域,Lucene 可以被認為是迄今為止最先進、性能最好的、功能最全的搜索引擎庫。注意,Lucene 只是一個庫。想要發揮其強大的作用,你需使用 Java 並要將其集成到你的應用中。
Lucene 非常復雜,你需要深入的了解檢索相關知識來理解它是如何工作的,就跟學習 springmvc 之前先從 servlet 開始,繁瑣復雜的工作,Solor、Elasticsearch 應由而生, 其使用 Java 編寫並使用 Lucene 來建立索引並實現搜索功能,但是它的目的是通過簡單連貫的 RESTful API 讓全文搜索變得簡單並隱藏 Lucene 的復雜性。
重要特性:
- 分布式的實時文件存儲,每個字段都被索引並可被搜索
- 實時分析的分布式搜索引擎
- 可以擴展到上百台服務器,處理PB級結構化或非結構化數據
基本概念:
索引(indices)-------------------Databases 數據庫
類型(type)----------------------Table 數據表
文檔(Document)---------------Row 行
字段(Field)---------------------Columns 列
詳細說明:
概念 | 說明 |
---|---|
索引庫(indices) | indices是index的復數,代表許多的索引, |
類型(type) | 類型是模擬mysql中的table概念,一個索引庫下可以有不同類型的索引,比如商品索引,訂單索引,其數據格式不同。不過這會導致索引庫混亂,因此未來版本中會移除這個概念 |
文檔(document) | 存入索引庫原始的數據。比如每一條商品信息,就是一個文檔 |
字段(field) | 文檔中的屬性 |
映射配置(mappings) | 字段的數據類型、屬性、是否索引、是否存儲等特性 |
要注意的是:Elasticsearch 本身就是分布式的,因此即便你只有一個節點,Elasticsearch 默認也會對你的數據進行分片和副本操作,當你向集群添加新數據時,數據也會在新加入的節點中進行平衡。
二、Elasticsearch安裝[windows]
如下主要針對 windows 環境下的 Elasticsearch 學習。
下載地址:https://www.elastic.co/cn/products/
解壓后,進入 bin/ 目錄,雙擊執行 elasticsearch .bat
Elasticsearch 啟動后可以看到綁定了兩個端口:

- 9300:集群節點間通訊接口【tcp連接方式,性能優於http】
- 9200:客戶端訪問接口【接收http請求】
9200,我們可以通過瀏覽器直接訪問,9300 則不可以直接訪問。

三、Kibana 安裝
Kibana 是一個基於 Node.js 的 Elasticsearch 索引庫數據統計工具,可以利用 Elasticsearch 的聚合功能,生成各種圖表,如柱形圖,線狀圖,餅圖等。
而且還提供了操作 Elasticsearch 索引數據的控制台,並且提供了一定的API提示,非常有利於我們學習 Elasticsearch 的語法。
1、配置
我們可以把 Kibana 當成,durid 連接池對於 mysql 的可視化來理解。
下載地址:https://www.elastic.co/cn/downloads/kibana
解壓后,進入安裝目錄下的 config 目錄,修改 kibana.yml 文件:
修改elasticsearch服務器的地址,去掉原來的注釋:

elasticsearch.url: "http://localhost:9200"
Kibana 的監聽端口為 5601:http://127.0.0.1:5601 瀏覽器打開如下圖所示:

Dev Tools 相當於一個命令行窗口工具,帶提示,Elasticsearch 執行的數據格式為 json,舉例:
POST _analyze
{
"analyzer": "ik_max_word",
"text": "我喜歡編程"
}

四、ik 分詞器安裝
由於 Elasticsearch 在拆分單詞時,是按空格來分,即 hello world 分為 hello 和 world,這是沒問題的,但是在拆分中文時也是按照一個漢字一個漢字來拆分。即“我喜歡編程”分為 我、喜、歡、編、程 5個字符,所以就需要用到 IK 分詞器這個插件來進行拆分。
Lucene 的 IK 分詞器早在 2012 年已經沒有維護了,現在我們要使用的是在其基礎上維護升級的版本,並且開發為 ElasticSearch 的集成插件了,與 Elasticsearch 一起維護升級,版本也保持一致。
IK下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
注意 ES 與 IK 版本對應地址:https://github.com/medcl/elasticsearch-analysis-ik/tree/2.x
將 zip 包,解壓到 Elasticsearch 目錄的 plugins 目錄中:

然后重啟 Elasticsearch
五、基本概念-詳細了解
上文也了解到 ES 操作的數據為 json,實際項目中,比如 springboot 中,無須操作 json,都是面向對象編程,但是,學習其實際原理固然重要。
5.1、創建索引
創建索引的請求格式:
- 請求方式:PUT
- 請求路徑:/索引庫名
- 請求參數:json格式:
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
- settings:索引庫的設置
- number_of_shards: 分片數量
- number_of_replicas:副本數量
示例:

5.2、查看索引設置
語法
Get請求可以幫我們查看索引信息,格式:
GET /索引庫名

5.3、刪除索引
刪除索引使用DELETE請求
語法
DELETE /索引庫名

六、映射配置
6.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 niceyoo2/_mapping/goods
{
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word"
},
"images": {
"type": "keyword",
"index": "false"
},
"price": {
"type": "float"
}
}
}
響應結果:
{
"acknowledged": true
}
6.2、查看映射關系
語法:
GET /索引庫名/_mapping
示例:
GET /niceyoo2/_mapping
響應:
{
"niceyoo2": {
"mappings": {
"goods": {
"properties": {
"images": {
"type": "keyword",
"index": false
},
"price": {
"type": "float"
},
"title": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
}
七、字段屬性詳解
7.1、type
Elasticsearch 中支持的數據類型非常豐富:

我們說幾個關鍵的:
String類型,又分兩種:
- text:可分詞,不可參與聚合
- keyword:不可分詞,數據會作為完整字段進行匹配,可以參與聚合
Numerical:數值類型,分兩類:
- 基本數據類型:long、interger、short、byte、double、float、half_float
- 浮點數的高精度類型:scaled_float
- 需要指定一個精度因子,比如10或100。elasticsearch會把真實值乘以這個因子后存儲,取出時再還原。
Date:日期類型
elasticsearch 可以對日期格式化為字符串存儲,但是建議我們存儲為毫秒值,存儲為 long,節省空間。
7.2、index
index影響字段的索引情況。
- true:字段會被索引,則可以用來進行搜索。默認值就是true
- false:字段不會被索引,不能用來搜索
index的默認值就是true,也就是說你不進行任何配置,所有字段都會被索引。
但是有些字段是我們不希望被索引的,比如商品的圖片信息,就需要手動設置index為false。
7.3、store
是否將數據進行額外存儲。
在學習lucene和solr時,我們知道如果一個字段的store設置為false,那么在文檔列表中就不會有這個字段的值,用戶的搜索結果中不會顯示出來。
但是在Elasticsearch中,即便store設置為false,也可以搜索到結果。
原因是Elasticsearch在創建文檔索引時,會將文檔中的原始數據備份,保存到一個叫做_source
的屬性中。而且我們可以通過過濾_source
來選擇哪些要顯示,哪些不顯示。
而如果設置store為true,就會在_source
以外額外存儲一份數據,多余,因此一般我們都會將store設置為false,事實上,store的默認值就是false。
7.4、boost
激勵因子,這個與lucene中一樣
其它的不再一一講解,用的不多,大家參考官方文檔:

最后
下篇帶大家詳細了解 elasticsearch 中的
- 增:隨機id、自定義id
- 刪:帶條件刪除
- 改:帶條件修改
- 查:帶條件查詢
推薦閱讀:
重溫Elasticsearch:https://www.cnblogs.com/niceyoo/p/11329426.html
elasticsearch集群搭建-windows:https://www.cnblogs.com/niceyoo/p/11343697.html
基於Docker方式實現Elasticsearch集群:https://www.cnblogs.com/niceyoo/p/11342903.html
18年專科畢業后一度迷茫,創建了一個用來記錄自己成長的公眾號,感興趣的小伙伴可以關注一下~
