架構不變,爲了學習方便,直接研究ElasticSearch-rtf版本。java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~redis
關於redis---配置文件中指定json
redis: pool: maxactive: 20 maxidle: 10 maxwait: 100 testonborrow: true ip: 127.0.0.1:6379
先修改成目的IP:ubuntu
redis: pool: maxactive: 20 maxidle: 10 maxwait: 100 testonborrow: true ip: 192.168.56.200:6379
啓動redis和ElasticSearch-rtf版本。服務器
~~~~~~~~~~~~~~~~~~~~~~~開始研究 redis篇架構
Q1:ElasticSeach何時鏈接上redis的?app
A:curl
root@ubuntu:/usr/local/elasticsearch-rtf/elasticsearch-rtf# lsof -i:6379 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME redis-ser 1927 root 4u IPv6 11682 0t0 TCP *:6379 (LISTEN) redis-ser 1927 root 5u IPv4 11683 0t0 TCP *:6379 (LISTEN) root@ubuntu:/usr/local/elasticsearch-rtf/elasticsearch-rtf# lsof -i:6379 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME redis-ser 1927 root 4u IPv6 11682 0t0 TCP *:6379 (LISTEN) redis-ser 1927 root 5u IPv4 11683 0t0 TCP *:6379 (LISTEN) redis-ser 1927 root 6u IPv4 13373 0t0 TCP localhost:6379->localhost:47239 (ESTABLISHED) java 1970 root 190u IPv6 12427 0t0 TCP localhost:47239->localhost:6379 (ESTABLISHED)
可見,系統啓動時,es根據配置項鍊接redis服務器。elasticsearch
Q2:ansj插件使用了redis的什麼功能來支持動態修改詞典的詞?學習
A: redis提供了channel頻道,使用publish命令來發布消息,subscribe來訂閱這個頻道,unsubscribe來取消訂閱頻道。
Q3:redis的channel頻道自己是否持久化發佈的消息?
A:根據測試代表,publish命令發佈後,redis只會給當前鏈接的客戶端發送消息,給全部鏈接的客戶端發送完畢後,自己內存不存儲消息,既然內存中不存儲,天然也不會持久化到redis硬盤裏。 固然咱們並不須要在redis端存儲,而是在es端存儲。
~~~~~~~~~~~~~~~~~~~~~~Ansj篇
Q4:經過redis對es添加動態的分詞後,對es的分詞會有什麼影響?
A:下面咱們來測試,添加腳本指定了映射分詞器query_ansj.
curl -i -XPUT 'http://localhost:9200/dew/_mapping/mobile' -d ' { "properties": { "title":{"type":"string","index":"analyzed","index_analyzer": "index_ansj","search_analyzer": "query_ansj"}, "content":{"type":"string","index":"analyzed","index_analyzer": "index_ansj","search_analyzer": "query_ansj"}, "tags":{"type":"string","index":"analyzed","index_analyzer": "index_ansj","search_analyzer": "query_ansj"} } } '
HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 Content-Length: 21 {"acknowledged":true}
代表建立映射方式成功。
添加分詞前,測試截圖以下,特地選擇了一個真實的網上電視劇標題來作測試:【很是臥底第一季(Graceland) 第12集】
而後經過redis添加分詞
再來查看分詞效果:
可見是增長了一個「很是臥底」
再來一下測試:
查看分詞效果:
不過這裏看到「第一季」「第12集」是能夠分別出來的。
Q5:動態添加的詞是否可持久化?
A: 如圖所示:
可見ansj插件作了持久化機制,這點很贊!
Q6:ansj的歧義糾正是什麼?
A:普通的分詞是根據詞典來進行分詞的,在這以前會參考歧義詞典來進行糾正,因此若是歧義詞典
有你想糾正歧義的語句,會優先根據歧義糾正語句來分詞。例子以下:
【很可能形成其餘的錯誤】
設定前:
經過redis添加:
查看如今的分詞效果:
Q7:ansj的動態歧義分詞是否可持久化?
A:支持,見圖
Q8:ansj是否支持經過redis動態添加/刪除stopWord?
A:從資料和代碼來看,rtf版代碼自己是不直接支持的,不過能夠經過修改源碼來實現這個效果。
Q9:如何修改源碼來支持經過redis動態添加/刪除stopWord?
A:
1)文件持久化支持
新增的方法-【FileUtils】類
public static void appendStopWord(String content) { try { File file = new File( AnsjElasticConfigurator.environment.configFile(), "ansj/stopLibrary.dic"); appendFile(content, file); } catch (IOException e) { logger.error("read exception", e, new Object[0]); e.printStackTrace(); } } public static void removeStopWord(String content) { try { File file = new File( AnsjElasticConfigurator.environment.configFile(), "ansj/stopLibrary.dic"); removeFile(content, file, false); } catch (FileNotFoundException e) { logger.error("file not found $ES_HOME/config/ansj/stopLibrary.dic"); new Object[0]); e.printStackTrace(); } catch (IOException e) { logger.error("read exception", e, new Object[0]); e.printStackTrace(); } }
編譯成功,這樣就支持了stopWord的持久化的增長/刪除。
3)經過redis消息來觸發內存/文件的更新編譯,完成。
else if ("s".equals(msg[0])) { if ("c".equals(msg[1])) { // add one stopWord into memory AnsjElasticConfigurator.filter.add(msg[2]); // add one stopWord into file FileUtils.appendStopWord(msg[2]); } else if ("d".equals(msg[1])) { // remove one stopWord from memory AnsjElasticConfigurator.filter.remove(msg[2]); // remove one stopWod from file FileUtils.removeStopWord(msg[2]); } }
final:測試
添加停詞前:
開始添加停詞
查看效果:
再看持久化。
研究到此爲止!