倒排索引 分詞 同義詞

2021-09-26 13:46:09 字數 4593 閱讀 3859

es的倒排索引:

文字分析(analysis),就是把全文轉換成一系列詞條(term / token)的過程(也叫分詞)。文字分析是通過分詞器(analyzer)實現的。

分詞器有兩個作用:

es內建了多種分詞器:

put":

"// 指定分詞器}}

}}

說明:已經存在的索引執行上述操作會報錯。可以在建立索引時指定。standard分詞器是預設的分詞器。

分詞器由以下三部分組合而成:

更多類別參考官網,每個分詞器必須有乙個tokenizer。

token filters:接收詞條流,進行再加工,可能會新增、刪除、或者變更詞條。比如:

更過token filter類別可以參考官網,乙個分詞器可以沒有或擁有多個token filter

通過組合以上三部分,我們也可以自定義分詞器。

###analyze介面

analyze介面可以用來執行文字分析處理,並檢視分詞結果,比如:

get _analyze

使用standard分詞器對文字進行分詞,返回結果如下:

,]

}

也可以自己定義分詞器,其實就是組合tokenizer, token filter 和 char filer,比如:

示例1:自定義token filter

post _analyze

示例2:自定義char_filter

post _analyze],

"text"

:"123-456, hello-world"

}// 結果如下:,]

}

也可以為某個索引(集)自定義分詞器:

put forum}}

},:}

}}

測試分詞效果:

get forum/_analyze

分詞結果如下:

,]

}

},

'char_filter':}

,'tokenizer':}

,'filter':}

, # "search_analyzer"

: # 也可以定義搜尋分詞器, 同analyzer

},},:}}

}

es內建的中文分詞不好用,可以通過外掛程式安裝,比如非常流行的ik分詞:

.\elasticsearch-plugin.bat install 

lysis-ik/releases/download/v7.2.0/elasticsearch-analysis-ik-7.2.0.zip

裝好後重啟es,檢視外掛程式列表:

get _cat/plugins
返回剛剛安裝的ik外掛程式

desktop-l1e59gr analysis-ik 7.2.0
ik支援一些自定義配置,比如擴充套件詞典和熱詞更新。配置檔案預設位置在es安裝目錄的configik目錄下。具體配置可以參考:lysis-ik

安裝完成後,我們測試下效果:

get _analyze

分詞結果:

,,

,,]}

put news}}

}

按照文件說明,索引一些doc進去:

put news/_doc/

4

進行高亮查詢:

post news/_search},

"highlight":}

}}

返回結果如下:

,"hits":,

"max_score"

:0.642793

,"hits":[

,"highlight":}

,,"highlight":}

]}}

測試下來後,在索引階段,建議使用ik_max_word分詞器,能更靈活的切割詞條。

除了ik分詞,還可以使用thulac分詞器,號稱準確率目前最高。不過目前只更新到6.4,不知道7.2能否使用。

get post001/_search}}

,"highlight":}

}}

synonym_graph詞條過濾器(token filter)用於處理同義詞。

注意:該過濾器僅適用於作為搜尋分詞器的一部分。如果想在索引期間應用同義詞,需要使用標準的同義詞過濾器

同義詞可以使用配置檔案指定,如下:

put/}

,"filter":}

}}}}

put/}

,"filter":,

"synonym_graph":}

}}}}

說明:bar在自定義的my_stop的filter中被剔除,但是在synonym_graph的filter中,foo => baz仍然被新增成功。但如果新增的是"foo, baz => bar", 那麼什麼也不會被新增到同義詞列表。這時因為對映到目標單詞"bar"本身作為停用詞已被剔除。相似的,如果對映是"bar, foo, baz"並且expand設定為false,那麼不會新增任何同義詞對映,因為當expandfalse時,目標對映是第乙個單詞,也就是"bar"。但是如果expand=true,那麼對映將會新增為"foo, baz => foo, baz",即所有詞相互對映,除了停用詞。

同義詞配置檔案如下:

# 空行和#號開頭的都是注釋

# 近義詞以 => 對映,這種對映會忽略模式中的 expand 引數

# 匹配到"=>"左側的詞條後,被替換為"=>"右側的詞條。

i-pod, i pod => ipod,

sea biscuit, sea biscit => seabiscuit

# 近義詞以逗號分隔,對映行為由模式中的expand引數決定。如此同樣的近義詞檔案,可以用於不同的策略

ipod, i-pod, i pod

foozball , foosball

universe , cosmos

lol, laughing out loud

# 當expand==true, "ipod, i-pod, i pod" 等價於:

ipod, i-pod, i pod => ipod, i-pod, i pod

# 當expand==false, "ipod, i-pod, i pod" 僅對映第乙個單詞, 等價於:

ipod, i-pod, i pod => ipod

# 多個同義詞對映將會合併

foo => foo bar

foo => baz

# 等價於:

foo => foo bar, baz

雖然可以直接在filter中使用synonyms定義同義詞,比如:

put

/test_index}}

}}}

但是對於大型的同義詞集合,還是推薦使用synonyms_path引數在檔案中定義。

put article},

"filter":}

,"search_analyzer"

:"ik_smart"}}

}}

在es的config/analysis目錄下新建synonyms.txt檔案,內容如下:

北京大學, 北大
索引一篇文件:

put article/_doc/

1

試著搜尋:

get article/_search}}

}

搜尋結果:

,"hits":,

"max_score"

:0.5753642

,"hits":[

}]}}

同義詞過濾器配置示例:

put

/test_index},

"filter":}

}}}}

其實同義詞過濾器和以上面的同義詞圖過濾器配置用法都是一樣的。區別如下:

另外在同義詞圖中的測試,將type更改後,測試仍然適用。

同義詞與索引

同義詞 近義詞 selectsysdate from dual dual 屬於一張臨時表,dual 原屬於sys 使用者,如果要使用 dual 就應該使用 sys.dual 才對,dual 為sys.dual 的同義詞 建立同義詞 create public synonym 同義詞名稱 for 模式...

中文檢索 分詞 同義詞 權重

1 首先匯入lucene相關包 lucene analyzers common 4.7.1.jar lucene core 4.7.1.jar lucene facet 4.7.1.jar lucene highlighter 4.7.1.jar lucene queries 4.7.1.jar l...

同義詞,索引,表分割槽

同義詞 資料字典 作用 遮蔽物件的名字及其持有者,為使用者簡化sql語句。建立私有同義詞 create synonym ee for scott.emp grant create synonym to scott grant create public synonym to scott 公有同義詞 ...