一、官方文檔
elasticsearch官網:elasticsearch官網
elasticsearch源碼:elasticsearch源碼
ik分詞器: ik分詞器
ik分詞器下載:ik分詞器下載
elasticsearch 版本選擇:elasticsearch 版本選擇
官方推薦Elasticsearch和jdk對應關系:官方推薦Elasticsearch和jdk對應關系
系統當前版本:
注:如果系統配置 JAVA_HOME,那么使用系統默認的 JDK,如果沒有配置使用自帶的 JDK,一般建議使用系統配置的 JDK。系統目前使用的jdk版本是:11.0.16.1,elasticsearch-env文件中注明:環境中配置:ES_JAVA_HOME>JAVA_HOME>ES_HOME
二、數據初始化
因為數據量不大,所以初始化方式比較直接,若是數據量大的時候,考慮使用第三方
**Q1:**初始化索引,大數據量時:單條數據操作存儲至索引,報錯,錯誤日志如下:org.springframework.dao.DataAccessResourceFailureException: 30,000 milliseconds timeout on connection http-outgoing-0 [ACTIVE]; nested exception is java.lang.RuntimeException: 30,000 milliseconds timeout on connection http-outgoing-0 [ACTIVE] at org.springframework.data.elasticsearch.core.ElasticsearchExceptionTranslator.translateExceptionIfPossible(ElasticsearchExceptionTranslator.java:94)
**W1:**當Elasticsearch需要在每次保存后刷新時,持續保存操作,使其無響應。
官方解釋鏈接:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/indices-refresh.html
文檔提示刷新占用大量資源:
問題代碼:
每個數據組裝后,保存文檔,并刷新索引
效果:45w企業數據:2個多小時初始化完成
方案一:
批量寫入,減少線程頻繁切換,單次批處理數據寫入后刷新一次,減少了刷新頻率
目前單次批處理數據為1000條,此數量可以再優化,數據條數一般是根據文檔的大小和服務器性能而定的,但是單次批處理的數據逐漸增加,當性能沒有提升時,把這個數據量作為最大值。
效果:45w企業數據:40分鐘初始化完成
方案二:
關閉刷新(Disable Refresh)是一種可以提高大量寫入操作性能的操作。關閉刷新將臨時禁止 Elasticsearch 自動刷新索引的操作,從而減少了寫入操作時的磁盤IO和刷新操作帶來的性能開銷。當需要大量寫入數據時,關閉刷新可以顯著提升索引的寫入性能。
GET 索引名稱
默認刷新時間為1s
設置為不自動刷新,但是緩沖區滿的時候也會觸發refresh操作(例:企業數據達到42萬條左右會自動觸發刷新):
PUT /索引名稱/_settings
{
"refresh_interval": -1
}
刷新指定index的數據:
POST /索引名稱/_refresh
效果:45w企業數據:33分鐘初始化完成
等數據初始化完成后,最后可以通過設置刷新時間的方式重新設置一個合適的刷新時間
三、快照、還原
在Elasticsearch中,快照備份是一種將索引和集群的狀態數據保存到可恢復的快照中的機制。通過創建快照,你可以在需要時恢復數據,或在不同的集群之間遷移數據。
方案一:
官網API方式:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/snapshot-restore-apis.html
第一步:
兩個單節點環境均在elasticsearch.yml中設置備份路徑,路徑自定義,兩個環境可不同備份路徑
環境A:path.repo: /backups/elasticsearch1
環境B: path.repo: /backups/elasticsearch2
配置后啟動環境A第二步:
在環境A對應的kibana中執行:
測試:
初始化:PUT company_index
POST company_index/_doc/1
{ "name":"小米手機"
}
GET company_index/_doc/1(1)創建快照存儲庫
PUT /_snapshot/companyku
{"type": "fs","settings": {"location": "/backups/elasticsearch1"}
}
(2)創建快照
PUT /_snapshot/companyku/snapshot_20230717?wait_for_completion=true
{
"indices": "company_index"
}第三步:
把環境A的/backups/elasticsearch1路徑下生成的文件內容。直接拷貝到環境B的/backups/elasticsearch2路徑下,啟動環境B的節點Es
在環境B對應的kibana中執行:
(1)創建快照存儲庫
PUT /_snapshot/companyku
{"type": "fs","settings": {"location": "/data/backups/elasticsearch2"}
}
(2)還原數據
POST /_snapshot/companyku/snapshot_20230717/_restore
{"indices": "company_index"
}注意:若提示索引已存在,則刪除當前已有的索引:DELETE company_index
方案二、Kibana
本地啟動kibana,打開網址:http://localhost:5601/app/management/data/snapshot_restore/repositories
Stack Management->Snapshot and Restore
elasticsearch.yml配置:path.repo: /backups/elasticsearch1
- Repositories注冊存儲庫
- Policies設置定時任務,最高頻:15分鐘
- Snapshot定時任務觸發或者手動觸發任務,生成快照,在/backups/elasticsearch1路徑下
- 新建一個節點,配置repo,將生成的快照復制到該路徑下,啟動節點,注冊同名存儲庫,自動出現快照數據,點擊恢復,選擇對應的索引,即可恢復。
定時任務配置備份頻率
四、IK分詞
目前英文是按單詞分詞,假設有需要新增分詞詞語:英文字母分詞
ik分詞器是把ik下載后放置在下載的es的plugins目錄下,
ik增加新的分詞:elasticsearch-7.17.6\plugins\ik\config
config下增加新文件:wyd_ik.dic(名稱自定義)
wyd_ik.dic文件內容:
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
一行就是一個詞
重新啟動es。
看到啟動日志打印加載成功
查看效果:
GET _analyze
{"analyzer": "ik_max_word","text": ["WYD", "國企", "1"]
}
五、 刪除索引的已有字段
官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/docs-reindex.html
PUT m1
{"mappings" : {"properties" : {"_class" : {"type" : "keyword","index" : false,"doc_values" : false},"age" : {"type" : "integer"},"id" : {"type" : "integer"},"name" : {"type" : "text","analyzer" : "ik_max_word"}}},"settings" : {"index" : {"refresh_interval" : "1s","store" : {"type" : "fs"}}}
}POST m1/_doc
{ "id":1, "age":2,
"name":"小花"
}POST /m1/_update_by_query
{"script": {"lang": "painless","inline": "ctx._source.remove(\"age\")"},"query": {"match_all": {}}
}GET m1/_searchPUT m2
{"mappings" : {"properties" : {"_class" : {"type" : "keyword","index" : false,"doc_values" : false},"id" : {"type" : "integer"},"name" : {"type" : "text","analyzer" : "ik_max_word"}}},"settings" : {"index" : {"refresh_interval" : "1s","store" : {"type" : "fs"}}}
}POST _reindex
{"source": {"index": "m1"},"dest": {"index": "m2"}
}GET m2/_search
六、代碼示例
寫了關于elasticsearch常用的方法示例,分組查詢、分頁查詢、高亮查詢、新增、修改、刪除、地理位置查詢等方式
代碼示例:https://gitee.com/wyd-mayun/elasticsearch.git
注:
刪除大數據量的索引,需要等待一下,若刪除后,立即創建同名的索引,無法創建最新的索引,很可能是之前舊的索引結構