阿里云ES實(shí)現(xiàn)同義詞動(dòng)態(tài)更新
Elasticsearch(ES)不支持直接動(dòng)態(tài)加載修改的詞典內(nèi)容,您可以通過安裝elasticsearch-analysis-dynamic-synonym插件,實(shí)現(xiàn)動(dòng)態(tài)加載OSS倉(cāng)庫(kù)詞典文件。本文以新網(wǎng)絡(luò)架構(gòu)下的阿里云ES實(shí)例為例,介紹如何實(shí)現(xiàn)同義詞動(dòng)態(tài)更新。
背景信息
阿里云Elasticsearch配置在VPC環(huán)境下,網(wǎng)絡(luò)可選性較小,例如公網(wǎng)環(huán)境下的詞典無(wú)法直接加載。Elasticsearch無(wú)法直接動(dòng)態(tài)加載修改的詞典內(nèi)容,需要結(jié)合場(chǎng)景開發(fā)自定義插件,例如使用elasticsearch-analysis-dynamic-synonym實(shí)現(xiàn)詞典動(dòng)態(tài)加載。
在VPC網(wǎng)絡(luò)架構(gòu)下,您可以通過以下流程,實(shí)現(xiàn)阿里云Elasticsearch加載外部詞典:
結(jié)合業(yè)務(wù)場(chǎng)景自定義插件。
例如elasticsearch-analysis-dynamic-synonym插件滿足業(yè)務(wù)場(chǎng)景,編譯該插件源碼,將正確的插件上傳到阿里云Elasticsearch中。
打通網(wǎng)絡(luò)。
詞典文件處于公網(wǎng)環(huán)境,或與阿里云Elasticsearch實(shí)例不在同一VPC下,或在自定義插件中集成了詞典所在域名或IP地址,導(dǎo)致網(wǎng)絡(luò)無(wú)法聯(lián)通,您可以通過以下方式加載外部詞典:
優(yōu)先選擇和阿里云Elasticsearch實(shí)例處于同一地域下的OSS內(nèi)網(wǎng)Endpoint作為詞典文件的調(diào)用地址,減少網(wǎng)絡(luò)打通等額外操作。各地域的OSS內(nèi)網(wǎng)Endpoint的詳細(xì)信息,請(qǐng)參見訪問域名和數(shù)據(jù)中心。
如果詞典文件存儲(chǔ)在與阿里云Elasticsearch實(shí)例非同一地域的OSS中,或在其他外部網(wǎng)絡(luò)環(huán)境下,您可以通過以下方式加載詞典:
新網(wǎng)絡(luò)架構(gòu)下:借助PrivateLink打通VPC環(huán)境,并通過nginx代理方式轉(zhuǎn)發(fā)請(qǐng)求進(jìn)行加載,詳細(xì)信息請(qǐng)參見配置實(shí)例私網(wǎng)連接。
舊網(wǎng)絡(luò)架構(gòu)下:通過代理或開啟Snat加載外部網(wǎng)絡(luò)環(huán)境下的詞典內(nèi)容,詳細(xì)信息請(qǐng)參見使用公網(wǎng)NAT網(wǎng)關(guān)SNAT功能訪問互聯(lián)網(wǎng)。
在阿里云Elasticsearch中創(chuàng)建索引時(shí),通過filter過濾器配置詞典文件,然后應(yīng)用到實(shí)際業(yè)務(wù)中。
注意事項(xiàng)
自定義插件或第三方開源插件的使用和維護(hù)(例如bug影響穩(wěn)定性)等,不在阿里云Elasticsearch的服務(wù)范圍內(nèi),建議您結(jié)合業(yè)務(wù)評(píng)估后使用。
操作流程
步驟一:環(huán)境準(zhǔn)備
創(chuàng)建新網(wǎng)絡(luò)架構(gòu)下的阿里云Elasticsearch實(shí)例,版本為7.10。
具體操作,請(qǐng)參見創(chuàng)建阿里云Elasticsearch實(shí)例。
開通OSS服務(wù),并創(chuàng)建公共讀Bucket。
具體操作,請(qǐng)參見開通OSS服務(wù)和控制臺(tái)創(chuàng)建存儲(chǔ)空間。
準(zhǔn)備詞典文件,并上傳至OSS。
具體操作,請(qǐng)參見控制臺(tái)上傳文件。本文使用的示例詞典文件為synonym.txt,文件內(nèi)容如下。
步驟二:下載elasticsearch-analysis-dynamic-synonym插件并編譯源碼
下載Elasticsearch 7.x版本對(duì)應(yīng)的elasticsearch-analysis-dynamic-synonym插件源碼。
git clone https://github.com/bells/elasticsearch-analysis-dynamic-synonym
說明在github上下載的master分支源碼,對(duì)應(yīng)的Elasticsearch版本為7.x。
修改pom.xml依賴版本,使其與Elasticsearch版本保持一致。
重新編譯打包。
說明編譯過程中可能會(huì)出現(xiàn)報(bào)錯(cuò),不同的版本報(bào)錯(cuò)存在差異,請(qǐng)結(jié)合編譯報(bào)錯(cuò)校正代碼。單擊下載編譯打包后的7.10版本的elasticsearch-analysis-dynamic-synonym插件。
步驟三:安裝插件
- 登錄阿里云Elasticsearch控制臺(tái)。
上傳并安裝自定義插件elasticsearch-analysis-dynamic-synonym。
具體操作,請(qǐng)參見上傳與安裝自定義插件。
在Kibana控制臺(tái),執(zhí)行以下命令查看安裝成功的插件。
說明登錄Kibana控制臺(tái)的具體操作,請(qǐng)參見登錄Kibana控制臺(tái)。
GET _cat/plugins?v
如果返回結(jié)果中包含analysis-dynamic-synonym插件,且版本與Elasticsearch實(shí)例版本一致,說明插件安裝成功。
步驟四:配置實(shí)例私網(wǎng)打通(可選)
如果您的詞典文件存儲(chǔ)在與阿里云Elasticsearch實(shí)例處于同一地域下的OSS中,可忽略此步驟。
- 登錄阿里云Elasticsearch控制臺(tái)。
配置Elasticsearch實(shí)例私網(wǎng)連接,獲取終端節(jié)點(diǎn)域名作為訪問外部服務(wù)的網(wǎng)絡(luò)鏈接。
具體操作,請(qǐng)參見配置實(shí)例私網(wǎng)連接。本文配置負(fù)載均衡實(shí)例監(jiān)聽的端口為8081。
步驟五:配置nginx代理(可選)
如果您的詞典文件存儲(chǔ)在與阿里云Elasticsearch實(shí)例處于同一地域下的OSS中,可忽略此步驟。
在ECS上安裝Nginx。此ECS為步驟四:配置實(shí)例私網(wǎng)打通(可選)中,用來(lái)轉(zhuǎn)發(fā)負(fù)載均衡請(qǐng)求的后端服務(wù)器。
具體安裝方法請(qǐng)參見Nginx安裝配置。
配置nginx.conf文件。
使用以下配置替換nginx.conf文件中
server
部分的配置。server { listen 8081; server_name localhost; charset utf-8; #access_log /var/log/nginx/host.access.log main; location / { # root /usr/share/nginx/html; # index index.html index.htm; proxy_pass https://<yourBucketName>.oss-cn-beijing.aliyuncs.com/synonym.txt; } # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} }
參數(shù)
說明
listen
監(jiān)聽端口。必須和負(fù)載均衡監(jiān)聽端口一致,本文使用8081。
proxy_pass
配置代理轉(zhuǎn)發(fā)。本文配置詞典所在的OSS Bucket的URL,獲取方式請(qǐng)參見控制臺(tái)分享文件。
加載修改后的配置文件并重啟Nginx。
/usr/local/webserver/nginx/sbin/nginx -s reload # 重新載入配置文件 /usr/local/webserver/nginx/sbin/nginx -s reopen # 重啟Nginx
步驟六:驗(yàn)證插件分詞效果
- 登錄目標(biāo)阿里云Elasticsearch實(shí)例的Kibana控制臺(tái),根據(jù)頁(yè)面提示進(jìn)入Kibana主頁(yè)。登錄Kibana控制臺(tái)的具體操作,請(qǐng)參見登錄Kibana控制臺(tái)。說明 本文以阿里云Elasticsearch 7.10.0版本為例,其他版本操作可能略有差別,請(qǐng)以實(shí)際界面為準(zhǔn)。
- 單擊右上角的Dev tools。
在Console頁(yè)簽中,執(zhí)行以下命令,創(chuàng)建索引并配置settings,在filter下調(diào)用dynamic_synonym接口,通過synonyms_path實(shí)現(xiàn)遠(yuǎn)程詞典加載。
PUT elastic_syn { "settings": { "index":{ "number_of_shards": "3", "number_of_replicas": "1", "analysis": { "analyzer": { "ik_max_syno": { "type":"custom", "tokenizer": "ik_max_word", "filter": [ "lowercase", "my_syno_filter" ] } }, "filter":{ "my_syno_filter":{ "type":"dynamic_synonym", "synonyms_path":"http://ep-bp1ia595641cd36b****-cn-hangzhou-i.epsrv-bp1n7oc1aot41irv****.cn-hangzhou.privatelink.aliyuncs.com:8081", "interval": 30 } } } } }, "mappings": { "properties": { "like": { "type": "text", "analyzer": "ik_max_syno", "search_analyzer": "ik_max_syno" }, "tx": { "type": "text", "analyzer": "ik_max_syno", "search_analyzer": "ik_max_syno" } } } }
filter中的參數(shù)說明如下,更多參數(shù)說明請(qǐng)參見Dynamic Synonym for ElasticSearch。
參數(shù)
說明
type
詞典文件類型。支持dynamic_synonym和dynamic_synonym_graph。
synonyms_path
詞典配置文件路徑或URL。請(qǐng)根據(jù)具體情況進(jìn)行設(shè)置:
詞典文件存儲(chǔ)在與阿里云Elasticsearch實(shí)例同一地域的OSS中:需要配置為http或https://<yourBucketName>.<OSS內(nèi)網(wǎng)Endpoint>/synonym.txt,例如https://mybucket.oss-cn-hangzhou-internal.aliyuncs.com/synonym.txt。OSS內(nèi)網(wǎng)Endpoint的獲取方式請(qǐng)參見訪問域名和數(shù)據(jù)中心。
詞典文件存儲(chǔ)在與阿里云Elasticsearch實(shí)例非同一地域的OSS中,或在其他外部網(wǎng)絡(luò)環(huán)境下(本文以此為例):需要配置為步驟四:配置實(shí)例私網(wǎng)打通(可選)中獲取到的終端節(jié)點(diǎn)域名。
interval
刷新詞典的時(shí)間間隔,單位為秒,默認(rèn):60。
驗(yàn)證分詞效果。
通過_analyze獲取洋芋分詞效果。
GET elastic_syn/_analyze { "analyzer": "ik_max_syno", "text": "洋芋" }
預(yù)期結(jié)果如下。
在遠(yuǎn)程同義詞詞典中更新詞典內(nèi)容,并驗(yàn)證分詞效果。
更新后的詞典內(nèi)容如下。
通過_analyze獲取仙女分詞效果。
GET elastic_syn/_analyze { "analyzer": "ik_max_syno", "text": "仙女" }
預(yù)期結(jié)果如下。