一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 一文講透Elasticsearch倒排索引與分詞

一文講透Elasticsearch倒排索引與分詞

2020-12-01 23:06JavaEdgeJavaEdge Java教程

本篇詳細講透Elasticsearch倒排索引與分詞。

1 倒排索引

1.1 書的目錄和索引

正排索引即目錄頁,根據(jù)頁碼去找內(nèi)容

一文講透Elasticsearch倒排索引與分詞

倒排索引即索引頁,根據(jù)關(guān)鍵詞去找對應(yīng)頁碼

一文講透Elasticsearch倒排索引與分詞

1.2 搜索引擎

  • 正排索引

        文檔Id =》文檔內(nèi)容、單詞的關(guān)聯(lián)關(guān)系

  • 倒排索引

         單詞 =》 文檔Id的關(guān)聯(lián)關(guān)系

  • 左:正排索引 =》 右:倒排索引
一文講透Elasticsearch倒排索引與分詞

倒排索引查詢流程

查詢包含"搜索引擎”的文檔

  1. 通過倒排索引獲得"搜索引擎”對應(yīng)的文檔Id有1和3
  2. 通過正排索引查詢1和3的完整內(nèi)容
  3. 返回最終結(jié)果

1.3 倒排索引的組成

1.3.1 單詞詞典( Term Dictionary )

倒排索引的重要組成

  • 記錄所有文檔的單詞 ,一般都比較大
  • 記錄單詞到倒排列表的關(guān)聯(lián)信息

單詞字典的實現(xiàn)一般是用B+ Tree ,示例如下

一文講透Elasticsearch倒排索引與分詞

1.3.2 倒排列表( Posting List )

記錄了單詞對應(yīng)的文檔集合,由倒排索引項( Posting )組成。

倒排索引項( Posting )主要包含如下信息:

  • 文檔Id ,用于獲取原始信息
  • 單詞頻率( TF, Term Frequency ),記錄該單詞在該文檔中的出現(xiàn)次數(shù),用于后續(xù)相關(guān)性算分
  • 位置( Position)
  • 記錄單詞在文檔中的分詞位置(多個) , 用于做詞語搜索( Phrase Query )
  • 偏移( Offset )

記錄單詞在文檔的開始和結(jié)束位置,用于做高亮顯示

案例

以搜索引擎為例

一文講透Elasticsearch倒排索引與分詞

單詞字典與倒排列表整合在一起的結(jié)構(gòu)

一文講透Elasticsearch倒排索引與分詞

ES存儲的是JSON格式文檔,其中包含多個字段,每個字段都有自己的倒排索引。

2 分詞

將文本轉(zhuǎn)換成一系列單詞的過程,也稱文本分析,在 ES 里稱為 Analysis。

比如文本【JavaEdge 是最硬核的公眾號】,分詞結(jié)果是【JavaEdge、硬核、公眾號】

2.1 Analyzer-分詞器

分詞器是 ES 專門處理分詞的組件,組成如下:

2.1.1 Character Filters

在Tokenizer之前對原始文本進行處理,比如增加、刪除或替換字符等。

針對原始文本進行處理,比如去除 html 特殊標(biāo)記符,自帶的如下:

  • HTML Strip 去除 html 標(biāo)簽和轉(zhuǎn)換 html 實體
  • Mapping 進行字符替換操作
  • Pattern Replace 進行正則匹配替換

會影響后續(xù)tokenizer解析的postion和offset信息

一文講透Elasticsearch倒排索引與分詞

2.1.2 Tokenizer

將原始文本按照一定規(guī)則切分為單詞,內(nèi)置:

  • standard 按單詞進行分割
  • letter 按非字符類進行分割
  • whitespace 按空格進行分割
  • UAX URL Email 按 standard 分割,但不會分割郵箱和 url
  • NGram 和 Edge NGram 連詞分割
  • Path Hierachy 按文件路徑進行分割

示例:

POST _analyze{ "tokenizer":"path_hierarchy", "text":"/one/two/three"}

一文講透Elasticsearch倒排索引與分詞

一文講透Elasticsearch倒排索引與分詞

2.1.3 Token Filters

針對 tokenizer 處理的單詞進行再加工,比如轉(zhuǎn)小寫、刪除或新增等處理,內(nèi)置:

  • lowercase 將所有 term 轉(zhuǎn)換為小寫
  • stop 刪除 stop words
  • NGram 和 Edge NGram 連詞分割
  • Synonym 添加近義詞的 term

示例

// filter 可以有多個 

POST _analyze 

    "text":"a Hello world!"

    "tokenizer":"standard"

    "filter":[ 

    "stop", // 把 a 去掉了 

    "lowercase",// 小寫 

    { 

        "type":"ngram"

        "min_gram":"4"

        "max_gram":"4" 

    } 

    ] 

// 得到 hell、ello、worl、orld 

 一文講透Elasticsearch倒排索引與分詞

分詞器的調(diào)用順序

一文講透Elasticsearch倒排索引與分詞

3 Analyze API

ES 提供了一個測試分詞的 API 接口,方便驗證分詞效果,endpoint 是 _analyze:

3.1 指定 analyzer

request

POST _analyze 

    "analyzer":"standard", # 分詞器 

    "text":" JavaEdge 公眾號" # 測試文本 

response

  "tokens" : [ 

    { 

      "token" : "java", # 分詞結(jié)果 

      "start_offset" : 1, # 起始偏移 

      "end_offset" : 5, # 結(jié)束偏移 

      "type" : "<ALPHANUM>"

      "position" : 0 # 分詞位置 

    }, 

    { 

      "token" : "edge"

      "start_offset" : 6, 

      "end_offset" : 10, 

      "type" : "<ALPHANUM>"

      "position" : 1 

    } 

  ] 

 一文講透Elasticsearch倒排索引與分詞

3.2 指定索引中的字段

POST  測試的索引/_analyze   

    "field":"username", # 測試字段 

    "text":"hello world" # 測試文本 

  一文講透Elasticsearch倒排索引與分詞

3.3 自定義分詞器

POST _analyze 

    "tokenizer":"standard"

    "filter":["lowercase"], # 自定義 

    "text":"hello world" 

之前的默認分詞器大寫

 一文講透Elasticsearch倒排索引與分詞

自定義小寫分詞器

一文講透Elasticsearch倒排索引與分詞

4 內(nèi)置分詞器

Standard Analyzer

默認分詞器,按詞切分,支持多語言,小寫處理

Simple Analyzer

按照非字母切分,小寫處理

一文講透Elasticsearch倒排索引與分詞

Whitespace Analyzer

按空格切分

一文講透Elasticsearch倒排索引與分詞

Stop Analyzer

Stop Word 指語氣助詞等修飾性詞語,比如 the、an、的、這等等,特性是相比 Simple Analyzer 多 Stop Word 處理

  一文講透Elasticsearch倒排索引與分詞

keyword Analyzer

不分詞,直接將輸入作為一個單詞輸出

 一文講透Elasticsearch倒排索引與分詞

Pattern Analyzer

通過正則表達式自定義分隔符,默認 \W+,即非字詞的符號為分隔符

一文講透Elasticsearch倒排索引與分詞

Language Analyzer

提供了 30+ 常見語言的分詞器

5 中文分詞

將一個漢字序列切分成一個個單獨的詞。在英文中,單詞之間是以空格作為自然分界符,漢語中詞沒有一個形式上的分界符。而且中文博大精深,上下文不同,分詞結(jié)果也大不相同。

比如:

  • 乒乓球拍/賣/完了
  • 乒乓球/拍賣/完了

以下是 ES 中常見的分詞系統(tǒng):

IK

實現(xiàn)中英文單詞的切分,可自定義詞庫,支持熱更新分詞詞典

jieba

python 中最流行餓分詞系統(tǒng),支持分詞和詞性標(biāo)注,支持繁體分詞,自定義詞典,并行分詞

以下是基于自然語言處理的分詞系統(tǒng):

Hanlp

由一系列模型與算法組成的 java 工具包,支持索引分詞、繁體分詞、簡單匹配分詞(極速模式)、基于 CRF 模型的分詞、N- 最短路徑分詞等,實現(xiàn)了不少經(jīng)典分詞方法。目標(biāo)是普及自然語言處理在生產(chǎn)環(huán)境中的應(yīng)用。

https://github.com/hankcs/HanLP

THULAC

  • THU Lexical Analyzer for Chinese ,由清華大學(xué)自然語言處理與社會人文計算

         實驗室研制推出的一套中文詞法分析工具包,具有中文分詞和詞性標(biāo)注功能

          https://github.com/microbun/elasticsearch-thulac-plugin

6 自定義分詞器

當(dāng)自帶的分詞無法滿足需求時,可以自定義分詞器,通過定義 Character Filters、Tokenizer、Token Filter 實現(xiàn)。自定義的分詞需要在索引的配置中設(shè)定,示例如下所示:

自定義如下分詞器

一文講透Elasticsearch倒排索引與分詞

// 自定義分詞器 

PUT test_index_name 

  "settings":{  

    "analysis":{ 

      "analyzer":{ 

        "my_customer_analyzer":{ 

          "type":"custome"

          "tokenizer":"standard"

          "char_filter":["html_strip"], 

          "filter":["lowercase""asciifolding"

        } 

      } 

    } 

  } 

 

// 測試自定義分詞器效果: 

POST test_index/_analyze 

  "tokenizer":"keyword"

  "char_filter":["html_strip"], 

  "text":"Is this <b>a box</b>?" 

 

// 得到 is、this、a、box 

7 分詞使用說明

分詞會在如下兩個時機使用:

創(chuàng)建或者更新文檔時(Index Time)

會對相應(yīng)的文檔進行分詞處理

索引時分詞是通過配置Index Mapping中每個字段的analyzer屬性實現(xiàn)的。不指定分詞時,使用默認standard。

查詢時(Search Time)

會對查詢語句進行分詞。查詢時分詞的指定方式:

  • 查詢的時候通過analyzer指定分詞器
  • 通過index mapping設(shè)置 search_analyzer 實現(xiàn)

分詞的最佳實踐

  • 明確字段是否需要分詞,不需要分詞的字段就將 type 設(shè)置為 keyword,可以節(jié)省空間和提高寫性能。
  • 善用 _analyze API,查看文檔的具體分詞結(jié)果
  • 多動手測試

參考

  • https://blog.csdn.net/weixin_38118016/article/details/90416391
  • https://mp.weixin.qq.com/s?__biz=MzU1NDA4NjU2MA==&mid=2247486148&idx=1&sn=817027a204650763c1bea3e837d695ea&source=41#wechat_redirect

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 2022国产麻豆剧传媒剧情 | 国产一区二区三区在线观看视频 | 日本精品久久久久中文字幕 1 | 欧美黑大吊 | 国产日韩片 | 日本黄视频在线播放 | 好吊妞乱淫 | 扒开双腿羞辱调教play视频 | 高清国产欧美一v精品 | 欧美日韩国产亚洲一区二区 | 四虎国产精品免费久久久 | 蜜桃视频在线观看官网 | 国产99视频精品免费视频免里 | 日韩欧美一区二区三区四区 | 3d动漫美女被吸乳羞羞有 | 亚洲国产精品久久人人爱 | 午夜亚洲国产 | 欧洲兽皇| 日韩精品成人a在线观看 | 91青青视频 | 欧美在线播放成人免费 | 青草视频网站在线观看 | 国产精品永久免费自在线观看 | 太紧太深了受不了黑人 | 9l桃色 | 亚洲福利区 | 国内激情自拍 | a级片在线观看免费 | 国产精品视频一区二区三区不卡 | 国产一卡二卡3卡4卡四卡在线 | 精品香蕉99久久久久网站 | 调教女秘书| 国产免费久久精品44 | 欧美美女一区二区三区 | 日韩操片 | 放荡的女老板bd中文字幕 | 91免费高清无砖码区 | 天天色天 | 欧美一级在线全免费 | 亚洲精品免费在线 | 免费精品视频在线 |