跳转到帖子
在手机APP中查看

一个更好的浏览方法。了解更多

PHP论坛人

主屏幕上的全屏APP,带有推送通知、徽章等。

在iOS和iPadOS上安装此APP
  1. 在Safari中轻敲分享图标
  2. 滚动菜单并轻敲添加到主屏幕
  3. 轻敲右上角的添加按钮。
在安卓上安装此APP
  1. 轻敲浏览器右上角的三个点菜单 (⋮) 。
  2. 轻敲添加到主屏幕安装APP
  3. 轻敲安装进行确认。

Elasticsearch 8.17.x + IK 分詞器 中文搜尋強化 (IPS 5.0.5 開始改用)

精选回复

自 Invision Community 5.0.5 起,最低版本要求提升為 Elasticsearch 8.0 ~ 9.0 版本。


注意:IK分詞器版本必須與 Elasticsearch 版本號完全一致,例如,Elasticsearch 8.17.4 版本 需要搭配 IK分詞器 8.17.4 版本。



------------------------------------------------------------
前置作業
------------------------------------------------------------


更新系統套件
apt update -y && apt upgrade -y



安裝必要依賴套件
apt install -y wget curl gnupg ca-certificates lsb-release









------------------------------------------------------------
安裝 Elasticsearch
------------------------------------------------------------

請先至 Elastic 歷史版本頁,確認所需版本,再調整以下指令中的版本號。
https://www.elastic.co/downloads/past-releases/


IK 分詞器 歷史版本
https://release.infinilabs.com/analysis-ik/stable/




下載安裝包

cd /root

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.17.4-amd64.deb




驗證下載完整性(SHA-512)

跳過校驗是生產環境常見風險,可能因下載中斷或來源污染而安裝損壞的套件。


下載官方 SHA-512 校驗檔
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.17.4-amd64.deb.sha512



執行校驗(應顯示 elasticsearch-8.17.4-amd64.deb: OK)
sha512sum -c elasticsearch-8.17.4-amd64.deb.sha512




若顯示 FAILED:請勿繼續安裝。

刪除下載檔案,重新下載後再次驗證。




安裝套件
dpkg -i elasticsearch-8.17.4-amd64.deb




安裝過程中會自動:
建立 elasticsearch 系統使用者與群組
建立資料目錄 /var/lib/elasticsearch
建立日誌目錄 /var/log/elasticsearch
建立設定目錄 /etc/elasticsearch
自動建立 logrotate 設定

安裝輸出中會出現一大段安全性設定資訊(包含自動產生的密碼與 enrollment token)。
由於我們接下來會關閉 Security 功能(僅限 localhost 使用),這些資訊可直接忽略。






-------------------------------------------
安裝 IK 中文分詞器
-------------------------------------------

為什麼需要 IK 分詞器?

Elasticsearch 內建的 Standard Analyzer(標準分詞器)對中文的處理方式是逐字切割(每個漢字獨立成一個 token),搜尋效果差。



安裝 IK 分詞器後,可依中文語意進行智慧斷詞:

分析器:ik_max_word
使用時機:建立索引(Index)時
特性:最細粒度拆分,窮舉所有可能組合,提升搜尋召回率


分析器:ik_smart
使用時機:搜尋查詢(Search)時
特性:最粗粒度拆分,符合語意的最少詞彙,提升精確率




斷詞效果示例(文字「中文論壇搜尋測試」):

ik_max_word:中文 / 文論 / 論壇 / 搜尋 / 測試 ……(細粒度)

ik_smart:中文 / 論壇 / 搜尋 / 測試(語意粒度)





----------------------------------
下載 IK 分詞器
----------------------------------

IK 版本必須與 Elasticsearch 完全相同(含 patch 版號)。



方法一:手動下載(推薦)

cd /root

wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.17.4.zip




方法二:透過 elasticsearch-plugin CLI 線上安裝

/usr/share/elasticsearch/bin/elasticsearch-plugin install \
    https://get.infini.cloud/elasticsearch/analysis-ik/8.17.4


方法二需要 VPS 能存取外部網路,且伺服器與遠端的連線品質須穩定。

若網路環境受限,請使用方法一。




----------------------------------------
驗證下載完整性(方法一適用)
----------------------------------------


cd /root

md5sum elasticsearch-analysis-ik-8.17.4.zip



取得輸出的 雜湊值後,至 infinilabs releases 頁面比對官方提供的值:

https://release.infinilabs.com/analysis-ik/stable/



Md5 Hash

ab1d88870a533be0defc62a5b1d82a7e  elasticsearch-analysis-ik-8.17.4.zip







---------------------------------------
安裝 IK 外掛(方法一適用)
---------------------------------------

必須在啟動 Elasticsearch 之前安裝外掛,或在安裝後重啟。

/usr/share/elasticsearch/bin/elasticsearch-plugin install \
    file:///root/elasticsearch-analysis-ik-8.17.4.zip






Continue with installation? [y/N]

出現提示時 輸入 y 確認繼續

-> Installed analysis-ik
-> Please restart Elasticsearch to activate any plugins installed


看到 Installed analysis-ik 即代表安裝成功






-------------------------------------
確認 Java 環境
-------------------------------------


Elasticsearch 8.x 已內建 OpenJDK,一般情況下不需要額外安裝 Java


確認內建 JDK 路徑存在
dpkg -L elasticsearch | grep jdk



驗證內建 JDK 版本
/usr/share/elasticsearch/jdk/bin/java -version



預期輸出範例
openjdk version "23" 2024-09-17
OpenJDK Runtime Environment (build 23+37-2369)
OpenJDK 64-Bit Server VM (build 23+37-2369, mixed mode, sharing)







---------------------------------------
調整設定檔
---------------------------------------

修改
vi /etc/elasticsearch/elasticsearch.yml



貼上以下內容


# =====================================================
# Elasticsearch 設定檔
# 適用:IPS論壇 / 單節點 / 僅限 localhost 存取
# VPS規格:2 vCPU / 2GB RAM
# =====================================================

# 叢集名稱
cluster.name: myforum-es

# 節點名稱
node.name: ips-node-1

# 資料與日誌路徑
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch

# 網路綁定:僅允許 localhost 存取,嚴禁對外開放
network.host: 127.0.0.1

# HTTP 連接埠
http.port: 9200

# 單節點模式(不需要多節點)
discovery.type: single-node

# 資料保護
# 防止誤刪索引:DELETE 操作必須指定具體索引名稱
# 禁止使用萬用字元刪除(如 DELETE /*),生產環境必備
action.destructive_requires_name: true

# 安全性設定
# 關閉 Security 安全認證(僅限 localhost 綁定時才可這樣設定)
# 警告:若 network.host 改為 0.0.0.0 對外開放,必須重新啟用 Security 並設定密碼,否則任何人皆可存取
xpack.security.enabled: false
xpack.security.enrollment.enabled: false

# 關閉 SSL(本機通訊不需要)
xpack.security.http.ssl.enabled: false
xpack.security.transport.ssl.enabled: false

# 效能保護
# 搜尋逾時保護:避免慢查詢無限期佔用資源
search.default_search_timeout: 60s


# 功能精簡(節省記憶體)
# 關閉機器學習功能(小論壇節省RAM)
xpack.ml.enabled: false





儲存檔案並離開vi編輯器
按 Esc,輸入 :wq,按 Enter





說明:

cluster.name
叢集名稱,自訂即可,但日後多節點時必須一致


action.destructive_requires_name: true
防止手滑執行 DELETE * 刪除所有索引,生產環境必備


xpack.security.enabled: false
僅限 127.0.0.1 綁定的本機場景適用;若對外開放必須啟用


xpack.ml.enabled: false
機器學習模組預設耗用大量 RAM,2GB VPS 務必關閉






---------------------------------
調整 JVM 記憶體
---------------------------------

Elasticsearch 預設 JVM 堆疊記憶體設定對 2GB RAM 的 VPS 而言過大,若不手動調小,

系統容易因記憶體耗盡而觸發 OOM(Out Of Memory),導致服務被強制終止。





建立目錄
mkdir -p /etc/elasticsearch/jvm.options.d



建立 JVM 調整檔
vi /etc/elasticsearch/jvm.options.d/custom-ram.options




貼上以下內容



# =====================================================
# JVM 堆疊記憶體設定
# VPS規格:2 vCPU / 2GB RAM
# =====================================================

# Xms(初始堆疊)與 Xmx(最大堆疊)必須設為相同值
# 設為相同值可避免 JVM 在執行期間動態調整堆疊大小所造成的 GC 抖動

# 2GB RAM VPS 建議設定:256m ~ 512m
# - 設太小(< 256m):GC 過於頻繁,搜尋效能明顯下降
# - 設太大(> 512m):Nginx、PHP-FPM、MariaDB 等服務記憶體不足

-Xms256m
-Xmx256m






儲存檔案並離開vi編輯器
按 Esc,輸入 :wq,按 Enter




---------------------------------
JVM 記憶體配置參考
---------------------------------


RAM 總量:2 GB
Elasticsearch JVM:256m(推薦)~ 512m(上限)
剩餘給其他服務:約 1.5 ~ 1.75 GB


RAM 總量:4 GB
Elasticsearch JVM:512m ~ 1g
剩餘給其他服務:約 3 ~ 3.5 GB


RAM 總量:8 GB
Elasticsearch JVM:1g ~ 2g
剩餘給其他服務:約 6 ~ 7 GB



Elasticsearch 官方建議 JVM 堆疊不超過實體記憶體的 50%,且不超過 30GB。

對 2GB VPS 而言,256m 是在搜尋效能與系統穩定之間的平衡點。









---------------------------------------------
調整系統核心參數
---------------------------------------------

Elasticsearch 使用記憶體映射檔案(MMap)存取索引。

若系統允許的記憶體映射數量上限不足,會在日誌中出現錯誤,並導致效能下降甚至拒絕請求,官方要求最少 262144



確認目前的 vm.max_map_count
sysctl vm.max_map_count





立即套用(臨時生效,重開機後失效)
sysctl -w vm.max_map_count=262144




永久生效(寫入 sysctl 設定檔)

cat > /etc/sysctl.d/99-elasticsearch.conf << 'EOF'
# Elasticsearch 要求的最低記憶體映射數量
# 官方要求最少 262144
vm.max_map_count=262144
EOF





套用設定
sysctl --system





驗證生效,預期輸出 vm.max_map_count = 262144

sysctl vm.max_map_count




說明:vm.max_map_count 控制單一程序可建立的記憶體映射區段數量上限。此值調整不影響其他服務,可安全設定。







---------------------------------------
啟動並驗證
---------------------------------------

啟用並啟動服務

systemctl daemon-reload


systemctl enable elasticsearch


systemctl start elasticsearch



說明:Elasticsearch 首次啟動需要 1~3 分鐘,請耐心等待。




-----------------------
確認服務狀態
-----------------------


確認服務狀態,應顯示 active (running)

systemctl status elasticsearch




若顯示 failed,請查看錯誤日誌

journalctl -u elasticsearch -n 50 --no-pager





------------------------------------
重開機驗證
------------------------------------


重開機
reboot



重開機後,再次確認服務是否正常,應顯示 active (running)
systemctl status elasticsearch





驗證 Elasticsearch 安裝完整性
/usr/share/elasticsearch/bin/elasticsearch-keystore list




確認 IK 外掛已安裝,應輸出:analysis-ik
/usr/share/elasticsearch/bin/elasticsearch-plugin list



確認 analysis-ik 版本 8.17.4
curl http://127.0.0.1:9200/_nodes/plugins?pretty






驗證 REST API 正常回應(應回傳包含 "You Know, for Search" 字串的 JSON,以及版本資訊。)
curl http://127.0.0.1:9200




驗證 IK 分詞器已載入
curl http://127.0.0.1:9200/_cat/plugins?v



應顯示
name              component   version
ips-node-1    analysis-ik     8.17.4




若 _cat/plugins 無輸出或未顯示 analysis-ik 代表 IK 未正確安裝。







--------------------------------
驗證 IK 分詞效果
--------------------------------

測試 ik_max_word(索引分詞模式)

curl -X POST \
"http://127.0.0.1:9200/_analyze" \
-H 'Content-Type: application/json' \
-d '{
  "analyzer":"ik_max_word",
  "text":"中文論壇搜尋測試"
}'





測試 ik_smart(搜尋分詞模式)

curl -X POST "http://127.0.0.1:9200/_analyze" \
  -H 'Content-Type: application/json' \
  -d '{
    "analyzer": "ik_smart",
    "text": "中文論壇搜尋測試"
  }'



比對兩者的斷詞差異:

ik_max_word 應輸出較多 token(細粒度)

ik_smart 應輸出較少 token(語意粒度)


兩者都不應出現逐字切割的結果(例如:`中`、`文`、`論`、`壇`……)


若分詞結果是逐字切割(每個漢字各自成一個 token),代表 IK 未正確載入,Elasticsearch 使用了 standard analyzer 作為後備。




--------------------------------------
驗證叢集健康狀態
--------------------------------------

curl http://127.0.0.1:9200/_cluster/health?pretty


應顯示 green 或 yellow(單節點環境正常)




說明:

單節點環境預期為 green,若顯示 yellow,通常代表部分索引的副本分片無法分配(單節點無法分配副本),這是正常現象;

若顯示 red,代表有主分片遺失,需要進一步排查。








------------------------
安全性強化
------------------------

確認 Elasticsearch 未對外開放

ss -tlnp | grep 9200


正確輸出(127.0.0.1:9200 僅綁定 localhost)




說明:若出現 0.0.0.0:9200,請立即修改 /etc/elasticsearch/elasticsearch.yml 中的 network.host 為 127.0.0.1,並重啟服務。






------------------------------------
防火牆確認(nftables)
------------------------------------

若已依照本系列教學設定 nftables 防火牆,9200 port 不應對外開放。確認防火牆規則

nft list ruleset | grep 9200



若無任何輸出,表示 nftables 並未開放 9200,符合預期

防禦縱深原則:即使 Elasticsearch 已綁定 127.0.0.1,防火牆也不應開放 9200 port,形成雙重防護。







------------------------------------
設定檔權限
------------------------------------


chmod 640 /etc/elasticsearch/elasticsearch.yml



chown root:elasticsearch /etc/elasticsearch/elasticsearch.yml



驗證
ls -la /etc/elasticsearch/elasticsearch.yml


應顯示:-rw-r----- 1 root elasticsearch ...





-------------------------------------------
資料目錄權限確認
-------------------------------------------

資料目錄權限確認

ls -la /var/lib/elasticsearch


ls -la /var/log/elasticsearch



兩個目錄的屬主應為 elasticsearch:elasticsearch。

若安裝後遭到誤改,執行:

chown -R elasticsearch:elasticsearch /var/lib/elasticsearch

chown -R elasticsearch:elasticsearch /var/log/elasticsearch




---------------------------------------
資源監控
---------------------------------------


查詢RAM占用情況
free -h



2 vCPU / 2GB RAM VPS 的正常參考值(搭配 Nginx、PHP-FPM、MariaDB 同時運行):

Mem:  1.2G used
available: 597M




說明:

used 約 1.2 ~ 1.4 GB 為正常範圍

available 應保持在 300MB 以上,否則有 OOM 風險



若 available 過低,請考慮:

1. 確認 JVM 設定是否已生效

2. 將 JVM 記憶體降至 256m

3. 確認 xpack.ml.enabled: false 已正確設定



--------------------------------------------
確認 JVM 記憶體設定是否生效
--------------------------------------------

curl -s http://127.0.0.1:9200/_nodes/jvm?pretty | grep -E "heap_init|heap_max"



預期顯示
"heap_init_in_bytes" : 268435456,
"heap_max_in_bytes" : 268435456



268435456 = 256MB 代表目前 Heap 已經是:
-Xms256m
-Xmx256m




若無輸出或數值不符,

請確認 /etc/elasticsearch/jvm.options.d/custom-ram.options 內容,並重啟 Elasticsearch











------------------------------
查看日誌
------------------------------


即時查看最新日誌
journalctl -u elasticsearch -f



查看最近 50 行日誌
journalctl -u elasticsearch -n 50 --no-pager



查看啟動錯誤
journalctl -u elasticsearch --since "5 minutes ago" --no-pager





---------------------------------------------------------
內建的 Log4j2 RollingFile 日誌輪轉機制
---------------------------------------------------------

Elasticsearch 8 已經使用內建的 Log4j2 RollingFile 日誌輪轉機制,而不是依賴 /etc/logrotate.d/elasticsearch。


grep -nE "RollingFile|Policies|Delete|IfAccumulatedFileSize|IfLastModified" \
/etc/elasticsearch/log4j2.properties










-----------------------------------------------------------
移除 Elasticsearch (更換版本用)
-----------------------------------------------------------

以下操作會永久刪除所有索引資料,請確認已備份或準備好重建索引。


停止並停用服務

systemctl stop elasticsearch


systemctl disable elasticsearch




徹底移除套件(含設定檔)
dpkg --purge elasticsearch



刪除索引資料目錄
rm -rf /var/lib/elasticsearch


刪除設定目錄
rm -rf /etc/elasticsearch


刪除日誌目錄
rm -rf /var/log/elasticsearch



重新載入systemd
systemctl daemon-reload



確認套件已完整移除(應無輸出)
dpkg -l | grep elasticsearch




確認目錄已刪除


ls /var/lib/elasticsearch

應顯示 No such file or directory



ls /etc/elasticsearch

應顯示 No such file or directory




完成後,重開機再依照本教學重新安裝所需版本
reboot

本帖最后于,由Jack编辑

参与讨论

你可立刻发布并稍后注册。 如果你有帐户,立刻登录发布帖子。

游客
抱歉,你的帖子内容包括我们不允许的字词。请编辑你的帖子,删除下面高亮的屏蔽字。
回帖…

帐户

导航

搜索

搜索

配置浏览器推送通知

Chrome (安卓)
  1. 轻敲地址栏旁的锁形图标。
  2. 轻敲权限 → 通知。
  3. 调整你的偏好。
Chrome (台式电脑)
  1. 点击地址栏中的挂锁图标。
  2. 选择网站设置。
  3. 找到通知选项并调整你的偏好。