<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 4367字,需瀏覽 9分鐘

           ·

          2020-12-05 21:58


          ? 點(diǎn)擊上方“JavaEdge”,關(guān)注公眾號(hào)

          設(shè)為“星標(biāo)”,好文章不錯(cuò)過(guò)!


          1 倒排索引




          1.1 書(shū)的目錄和索引


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

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



          1.2 搜索引擎


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

          • 倒排索引
            單詞 =》 文檔Id的關(guān)聯(lián)關(guān)系

          • 左:正排索引 =》 右:倒排索引



          倒排索引查詢流程


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

          1. 通過(guò)倒排索引獲得"搜索引擎”對(duì)應(yīng)的文檔Id有1和3

          2. 通過(guò)正排索引查詢1和3的完整內(nèi)容

          3. 返回最終結(jié)果




          1.3 倒排索引的組成


          1.3.1 單詞詞典( Term Dictionary )


          倒排索引的重要組成

          • 記錄所有文檔的單詞 ,一般都比較大

          • 記錄單詞到倒排列表的關(guān)聯(lián)信息

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

          1.3.2 倒排列表( Posting List )


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

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

          • 文檔Id ,用于獲取原始信息

          • 單詞頻率( TF, Term Frequency ),記錄該單詞在該文檔中的出現(xiàn)次數(shù),用于后續(xù)相關(guān)性算分

          • 位置( Position)

            記錄單詞在文檔中的分詞位置(多個(gè)) , 用于做詞語(yǔ)搜索( Phrase Query )

          • 偏移( Offset )

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


          案例


          以搜索引擎為例

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

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


          2 分詞



          將文本轉(zhuǎn)換成一系列單詞的過(guò)程,也稱文本分析,在 ES 里稱為 Analysis。
          比如文本【JavaEdge 是最硬核的公眾號(hào)】,分詞結(jié)果是【JavaEdge、硬核、公眾號(hào)】




          2.1 Analyzer-分詞器



          分詞器是 ES 專門(mén)處理分詞的組件,組成如下:


          2.1.1 Character Filters



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

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

          • HTML Strip 去除 html 標(biāo)簽和轉(zhuǎn)換 html 實(shí)體

          • Mapping 進(jìn)行字符替換操作

          • Pattern Replace 進(jìn)行正則匹配替換

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

          2.1.2 Tokenizer

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

          • standard 按單詞進(jìn)行分割

          • letter 按非字符類進(jìn)行分割

          • whitespace 按空格進(jìn)行分割

          • UAX URL Email 按 standard 分割,但不會(huì)分割郵箱和 url

          • NGram 和 Edge NGram 連詞分割

          • Path Hierachy 按文件路徑進(jìn)行分割

          示例:

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

          2.1.3 Token Filters

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

          • lowercase 將所有 term 轉(zhuǎn)換為小寫(xiě)

          • stop 刪除 stop words

          • NGram 和 Edge NGram 連詞分割

          • Synonym 添加近義詞的 term

          示例

          // filter 可以有多個(gè)
          POST _analyze
          {
          "text":"a Hello world!",
          "tokenizer":"standard",
          "filter":[
          "stop", // 把 a 去掉了
          "lowercase",// 小寫(xiě)
          {
          "type":"ngram",
          "min_gram":"4",
          "max_gram":"4"
          }
          ]
          }
          // 得到 hell、ello、worl、orld

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

          3 Analyze API

          ES 提供了一個(gè)測(cè)試分詞的 API 接口,方便驗(yàn)證分詞效果,endpoint 是 _analyze:

          3.1 指定 analyzer

          request

          POST _analyze
          {
          "analyzer":"standard", # 分詞器
          "text":" JavaEdge 公眾號(hào)" # 測(cè)試文本
          }

          response

          {
          "tokens" : [
          {
          "token" : "java", # 分詞結(jié)果
          "start_offset" : 1, # 起始偏移
          "end_offset" : 5, # 結(jié)束偏移
          "type" : "",
          "position" : 0 # 分詞位置
          },
          {
          "token" : "edge",
          "start_offset" : 6,
          "end_offset" : 10,
          "type" : "",
          "position" : 1
          }
          ]
          }

          3.2 指定索引中的字段

          POST  測(cè)試的索引/_analyze  
          {
          "field":"username", # 測(cè)試字段
          "text":"hello world" # 測(cè)試文本
          }

          3.3 自定義分詞器

          POST _analyze
          {
          "tokenizer":"standard",
          "filter":["lowercase"], # 自定義
          "text":"hello world"
          }
          • 之前的默認(rèn)分詞器大寫(xiě)

          • 自定義小寫(xiě)分詞器

          4 內(nèi)置分詞器

          Standard Analyzer

          默認(rèn)分詞器,按詞切分,支持多語(yǔ)言,小寫(xiě)處理

          Simple Analyzer

          按照非字母切分,小寫(xiě)處理

          Whitespace Analyzer

          • 按空格切分

          Stop Analyzer

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

          keyword Analyzer

          不分詞,直接將輸入作為一個(gè)單詞輸出

          Pattern Analyzer

          通過(guò)正則表達(dá)式自定義分隔符,默認(rèn) \W+,即非字詞的符號(hào)為分隔符

          Language Analyzer

          提供了 30+ 常見(jiàn)語(yǔ)言的分詞器

          5 中文分詞

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

          • 乒乓球拍/賣/完了

          • 乒乓球/拍賣/完了

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

          IK

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

          jieba

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

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

          Hanlp

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

          THULAC

          • THU Lexical Analyzer for Chinese ,由清華大學(xué)自然語(yǔ)言處理與社會(huì)人文計(jì)算
            實(shí)驗(yàn)室研制推出的一套中文詞法分析工具包,具有中文分詞和詞性標(biāo)注功能
            https://github.com/microbun/elasticsearch-thulac-plugin

          6 自定義分詞器

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

          • 自定義如下分詞器


            // 自定義分詞器PUT test_index_name{  "settings":{     "analysis":{      "analyzer":{        "my_customer_analyzer":{          "type":"custome",          "tokenizer":"standard",          "char_filter":["html_strip"],          "filter":["lowercase", "asciifolding"]        }      }    }  }}
            // 測(cè)試自定義分詞器效果:POST test_index/_analyze{ "tokenizer":"keyword", "char_filter":["html_strip"], "text":"Is this a box?"}
            // 得到 is、this、a、box

          7 分詞使用說(shuō)明

          分詞會(huì)在如下兩個(gè)時(shí)機(jī)使用:

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

          會(huì)對(duì)相應(yīng)的文檔進(jìn)行分詞處理

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

          查詢時(shí)(Search Time)

          會(huì)對(duì)查詢語(yǔ)句進(jìn)行分詞。查詢時(shí)分詞的指定方式:

          • 查詢的時(shí)候通過(guò)analyzer指定分詞器

          • 通過(guò)index mapping設(shè)置?search_analyzer?實(shí)現(xiàn)

          分詞的最佳實(shí)踐

          • 明確字段是否需要分詞,不需要分詞的字段就將 type 設(shè)置為 keyword,可以節(jié)省空間和提高寫(xiě)性能。

          • 善用 _analyze API,查看文檔的具體分詞結(jié)果

          • 多動(dòng)手測(cè)試

          參考

          • 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

          往期推薦


          大廠如何解決數(shù)值精度/舍入/溢出問(wèn)題

          大廠數(shù)據(jù)庫(kù)事務(wù)實(shí)踐-事務(wù)生效就能保證正確回滾?

          線上問(wèn)題事跡(一)數(shù)據(jù)庫(kù)事務(wù)居然都沒(méi)生效?

          硬核干貨:HTTP超時(shí)、重復(fù)請(qǐng)求必見(jiàn)坑點(diǎn)及解決方案

          給大忙人們看的Java NIO教程之Channel





          目前交流群已有?800+人,旨在促進(jìn)技術(shù)交流,可關(guān)注公眾號(hào)添加筆者微信邀請(qǐng)進(jìn)群


          喜歡文章,點(diǎn)個(gè)“在看、點(diǎn)贊、分享”素質(zhì)三連支持一下~

          瀏覽 32
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲综合五月天婷婷丁香2 | www.三级网站 | 中文字幕精品久久久 | 激情网站www | 成年人视频在线看 |