elasticsearch 倒排索引與分詞

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。
原文連接: https://blog.csdn.net/bingdianone/article/details/85705162

書的目錄與索引

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
書與搜索引擎是類似的。
  ·目錄頁對應正排索引
  ·索引頁對應倒排索引
搜索引擎
  ·正排索引
   -文檔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

相關文章
相關標籤/搜索