個人架構演化筆記 10:ElasticSearch的分詞器之ansj研究

架構不變,爲了學習方便,直接研究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:測試

 添加停詞前:

 開始添加停詞

 

查看效果:

 

再看持久化。

 

研究到此爲止!

相關文章
相關標籤/搜索