書的目錄與索引
書與搜索引擎是類似的。
·目錄頁對應正排索引
·索引頁對應倒排索引
搜索引擎
·正排索引
-文檔Id到文檔內容、單詞的關聯關係
·倒排索引
-單詞到文檔Id的關聯關係css
正排與倒排索引簡介
正排索引
-文檔Id到文檔內容、單詞的關聯關係
·倒排索引
-單詞到文檔Id的關聯關係
html
倒排索引-查詢流程
·查詢包含"搜索引擎"的文檔
-經過倒排索引得到"搜索引擎"對應的文檔Id有1和3
-經過正排索引查詢1和3的完整內容
-返回用戶最終結果python
倒排索引詳解
倒排索引組成:
倒排索引是搜索引擎的核心,主要包含兩部分:
-單詞詞典( Term Dictionary)
-倒排列表( Posting List )
倒排索引一單詞詞典
·單詞詞典( Term Dictionary )是倒排索引的重要組成
-記錄全部文檔的單詞,通常都比較大
-記錄單詞到倒排列表的關聯信息
·單詞字典的實現通常是用B+ Tree ,示例以下圖:
-下圖排序採用拼音實現,構造方法參見以下網址
https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
倒排索引-倒排列表
·倒排列表( Posting List )記錄了單詞對應的文檔集合,由倒排索引項( Posting )組成git
·倒排索引項( Posting )主要包含以下信息:
-文檔Id ,用於獲取原始信息
-單詞頻率( TF, Term Frequency ) ,記錄該單詞在該文檔中的出現次數,用於後續相關性算分
-位置( Position ) ,記錄單詞在文檔中的分詞位置(多個) ,用於作詞語搜索(Phrase Query)
-偏移( Offset ) ,記錄單詞在文檔的開始和結束位置,用於作高亮顯示·
以「搜索引擎」爲例github
. es存儲的是一個json格式的文檔,其中包含多個字段,每一個字段會有本身的倒排索引
相似下圖:
web
分詞介紹
·分詞是指將文本轉換成一系列單詞( term or token )的過程,也能夠叫作文本分析,在es裏面稱爲Analysis ,以下圖所示:
·分詞器是es中專門處理分詞的組件,英文爲Analyzer ,它的組成以下
- Character Filters
-針對原始文本進行處理,好比去除html特殊標記符
- Tokenizer
-將原始文本按照必定規則切分爲單詞
- Token Filters
-針對tokenizer處理的單詞就行再加工,好比轉小寫、刪除或新增等處理
算法
analyze_api
. es提供了一個測試分詞的api接口,方便驗證分詞效果, endpoint是_analyze
-能夠直接指定analyzer進行測試
-能夠直接指定索引中的字段進行測試
-能夠自定義分詞器進行測試
·直接指定analyzer進行測試,接口以下:
當沒有定義analyzer的時候會使用默認分詞器」analyzer」:」standard」
自定義分詞器:tokenizer指名要用哪一個分詞器,filter指明的是token filter:
json
自帶分詞器
.es自帶以下的分詞器
-Standard Simple
-Whitespace
-Stop
-Keyword
-Pattern
-Languageapi
Standard Analyzer
Simple Analyzer
Whitespace Analyzer
Stop Analyzer
Keyword Analyzer
Pattern Analyzer
Language Analyzer
中文分詞
·難點
-中文分詞指的是將一個漢字序列切分紅一個一個單獨的詞。在英文中,單詞之間是以空格做爲天然分界符,漢語中詞沒有一個形式上的分界符。
-上下文不一樣,分詞結果迥異,好比交叉歧義問題,好比下面兩種分詞都合理
-乒乓球拍/賣完了
-乒乓球/拍賣/完了
- https://mp.weixin.qq.com/s/SiHSMrn8lxCmrtHbcwL-NQ
·經常使用分詞系統
-IK
-實現中英文單詞的切分,支持ik smart, ik maxword等模式
-可自定義詞庫,支持熱更新分詞詞典,
- https://github.com/medcl/elasticsearch-analysis-ik
- jieba
-python中最流行的分詞系統,支持分詞和詞性標註
-支持繁體分詞、自定義詞典、並行分詞等
- https://github.com/sing1ee/elasticsearch-jieba-plugin
·基於天然語言處理的分詞系統
- Hanlp
-由一系列模型與算法組成的Java工具包,目標是普及天然語言處理在生產環境中的應用
- https://github.com/hankcs/HanLP
-THULAC
-THU Lexical Analyzer for Chinese ,由清華大學天然語言處理與社會人文計算實驗室研製推出的一套中文詞法分析工具包,具備中文分詞和詞性標註功能
- https://github.com/microbun/elasticsearch-thulac-pluginmarkdown
自定義分詞
CharacterFilter
·當自帶的分詞沒法知足需求時,能夠自定義分詞
-經過自定義Character Filters, Tokenizer和Token Filter實現. Character Filters
-在Tokenizer以前對原始文本進行處理,好比增長、刪除或替換字符等
-自帶的以下:
-HTML Strip去除html標籤和轉換html實體
-Mapping進行字符替換操做
-Pattern Replace進行正則匹配替換
-會影響後續tokenizer解析的postion和offset信息
. Character Filters測試時能夠採用以下api :
Tokenizer
Tokenizer
-將原始文本按照必定規則切分爲單詞( term or token )
-自帶的以下:
-standard按照單詞進行分割
-letter按照非字符類進行分割
-whitespace按照空格進行分割
-UAX URL Email按照standard分割,但不會分割郵箱和url
-NGram和Edge NGram連詞分割
-Path Hierarchy按照文件路徑進行切割
Tokenizer測試時能夠採用以下api:
TokenFilter
. Token Filters
-對於tokenizer輸出的單詞( term )進行增長、刪除、修改等操做
-自帶的以下:
-lowercase將全部term轉換爲小寫
-stop刪除stop words
-NGram和Edge NGram連詞分割
-Synonym添加近義詞的term
Filter測試時能夠採用以下api:
自定義分詞
.自定義分詞的api
-自定義分詞須要在索引的配置中設定,以下所示:
自定義以下圖所示的分詞器:
自定義分詞驗證:
自定義以下圖所示的分詞器二:
自定義分詞驗證:
分詞使用說明
·分詞會在以下兩個時機使用:
-建立或更新文檔時(Index Time ) ,會對相應的文檔進行分詞處理
-查詢時( Search Time ) ,會對查詢語句進行分詞
索引時分詞
·索引時分詞是經過配置Index Mapping中每一個字段的analyzer屬性實現的以下:
不指定分詞時,使用默認standard
查詢時分詞
·查詢時分詞的指定方式有以下幾種:
-查詢的時候經過analyzer指定分詞器
-經過index mapping設置search_analyzer實現
.通常不須要特別指定查詢時分詞器,直接使用索引時分詞器便可,不然會出現沒法匹配的狀況
分詞建議
·明確字段是否須要分詞,不須要分詞的字段就將type設置爲keyword ,能夠節省空間和提升寫性能
·善用_analyze API ,查看文檔的具體分詞結果
·動手測試,
官方文檔分詞連接
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis.html