Elasticsearch Analyzer 內置分詞器

来源:https://www.cnblogs.com/askajohnny/archive/2022/11/04/16857457.html
-Advertisement-
Play Games

Elasticsearch Analyzer 內置分詞器 篇主要介紹一下 Elasticsearch中 Analyzer 分詞器的構成 和一些Es中內置的分詞器 以及如何使用它們 前置知識 es 提供了 analyze api 可以方便我們快速的指定 某個分詞器 然後對輸入的text文本進行分詞 幫 ...


Elasticsearch Analyzer 內置分詞器

篇主要介紹一下 Elasticsearch中 Analyzer 分詞器的構成 和一些Es中內置的分詞器 以及如何使用它們

image-20221103233624275

前置知識

es 提供了 analyze api 可以方便我們快速的指定 某個分詞器 然後對輸入的text文本進行分詞 幫助我們學習和實驗分詞器

POST _analyze
{
  "analyzer": "standard",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

[ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone ]

1.Analyzer

在ES中有很重要的一個概念就是 分詞,ES的全文檢索也是基於分詞結合倒排索引做的。所以這一文我們來看下何謂之分詞。如何分詞。

分詞器是專門處理分詞的組件,在很多中間件設計中每個組件的職責都劃分的很清楚,單一職責原則,以後改的時候好擴展。
分詞器由三部分組成。

  • Character Filters : 主要對原文本做處理, 例如 去除 html 標簽
  • Tokenizer : 按照規則 把文本切分為單詞, 也就是分詞
  • Token Filters : 將切分後的單詞 進行加工處理, 小寫,刪除stopwords 停頓詞, 增加同義詞 , 擴展一些

分詞場景:

  1. 數據寫入index 的時候進行分詞
  2. query 查詢時候 需要對查詢文本 進行分詞

image-20221103163336660

2.Elasticsearch 內置分詞器

在es中有不少內置分詞器

  • Standard Analyzer : 預設分詞器, 按Unicode文本分割演算法拆分 , 轉化為小寫 , 支持中文(但是中文按照每個文字拆分,沒啥意義)
  • Simple Analyzer : 按照非字母切分 並且轉化為小寫
  • Stop Analyzer : 和 simple 一樣 但是多了 過濾停用詞(the a is) 預設使用 stop token filter 的 _ _ english _ _ 預定義
  • Whitespace Analyzer : 每當遇到 空格的時候 會進行分詞 , 不會轉小寫
  • Keyword Analyzer : 不分詞 直接將輸入當做輸出
  • Patter Analyzer : 正則表達式
  • Language : 語言分詞器 30多種
  • Customer Analyzer : 自定義分詞器

3. Standard Analyzer

Standard 是es中預設的分詞器 , 它是按照 Unicode 文本分割演算法去 對文本進行分詞的

POST _analyze
{
  "analyzer": "standard",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

[ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone ]

3.1 Definition

包括了 轉小寫的 token filter 和 stop token filter 去除停頓詞

Tokenizer

  • [Standard Tokenizer]

Token Filters

  • [Standard Token Filter] : 沒用只是作為保留的token filter (The standard token filter currently does nothing. It remains as a placeholder in case some filtering function needs to be added in a future version.)
  • [Lower Case Token Filter] : 轉小寫的 token filter
  • [Stop Token Filter] : 停頓詞 token filter 預設是沒有開啟

3.2 Configuration

  • max_token_length : 最大的分詞長度,如果超過此長度 則直接分詞 default 255
  • stopwords : 預定義的停頓詞列表 如: _ _ englisth _ _ 或者 停頓詞數組[] 預設 none 不設置
  • stopwords_path : 包含停頓詞的文件路徑

3.3 實驗

// 使用 自定義的分詞器 基於 standard
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_english_analyzer": {
          "type": "standard", 
          "max_token_length": 5, // 最大詞數
          "stopwords": "_english_" // 開啟過濾停頓詞 使用 englisth 語法
        }
      }
    }
  }
}


GET my_index/_analyze
{
  "analyzer": "my_english_analyzer",
  "text": "The hellogoodname jack"
}
// 可以看到 最長5個字元 就需要進行分詞了, 並且停頓詞 the 沒有了
["hello", "goodn", "ame", "jack"]

4. Simple Analyzer

簡單的分詞器 分詞規則就是 遇到 非字母的 就分詞, 並且轉化為小寫,(lowercase tokennizer )

POST _analyze
{
  "analyzer": "simple",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

[ the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]

4.1 Definition

Tokenizer

  • Lower Case Tokenizer

4.2 Configuation

無配置參數

4.3 實驗

simple analyzer 分詞器的實現 就是如下

PUT /simple_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_simple": {
          "tokenizer": "lowercase",
          "filter": [         
          ]
        }
      }
    }
  }
}

5. Stop Analyzer

stop analyzer 和 simple analyzer 一樣, 只是多了 過濾 stop word 的 token filter , 並且預設使用 english 停頓詞規則

POST _analyze
{
  "analyzer": "stop",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
// 可以看到 非字母進行分詞 並且轉小寫 然後 去除了停頓詞
[ quick, brown, foxes, jumped, over, lazy, dog, s, bone ]

5.1 Definition

Tokenizer

  • Lower Case Tokenizer : 轉小寫的

Token filters

  • Stop Token Filter : 過濾停頓詞 預設使用 規則 english

5.2 Configuration

  • stopwords : 指定分詞的規則 預設 english , 或者分詞的數組
  • stopwords_path : 指定分詞停頓詞文件

5.3 實驗

如下就是對 Stop Analyzer 的實現 , 先轉小寫 後進行停頓詞的過濾

PUT /stop_example
{
  "settings": {
    "analysis": {
      "filter": {
        "english_stop": {
          "type":       "stop",
          "stopwords":  "_english_" 
        }
      },
      "analyzer": {
        "rebuilt_stop": {
          "tokenizer": "lowercase",
          "filter": [
            "english_stop"          
          ]
        }
      }
    }
  }
}

設置 stopwords 參數 指定過濾的停頓詞列表

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_stop_analyzer": {
          "type": "stop",
          "stopwords": ["the", "over"]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_stop_analyzer",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

[ quick, brown, foxes, jumped, lazy, dog, s, bone ]

6. Whitespace Analyzer

空格 分詞器, 顧名思義 遇到空格就進行分詞, 不會轉小寫

POST _analyze
{
  "analyzer": "whitespace",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

[ The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog's, bone. ]

6.1 Definition

Tokenizer

  • Whitespace Tokenizer

6.2 Configuration

無配置

6.3 實驗

whitespace analyzer 的實現就是如下, 可以根據實際情況進行 添加 filter

PUT /whitespace_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_whitespace": {
          "tokenizer": "whitespace",
          "filter": [         
          ]
        }
      }
    }
  }
}

7. Keyword Analyzer

很特殊 它不會進行分詞, 怎麼輸入 就怎麼輸出

POST _analyze
{
  "analyzer": "keyword",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

//註意 這裡並沒有進行分詞 而是原樣輸出
[ The 2 QUICK Brown-Foxes jumped over the lazy dog's bone. ]

7.1 Definition

Tokennizer

  • Keyword Tokenizer

7.2 Configuration

無配置

7.3 實驗

rebuit 如下 就是 Keyword Analyzer 實現

PUT /keyword_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_keyword": {
          "tokenizer": "keyword",
          "filter": [         
          ]
        }
      }
    }
  }
}

8. Patter Analyzer

正則表達式 進行拆分 ,註意 正則匹配的是 標記, 就是要被分詞的標記 預設是 按照 \w+ 正則分詞

POST _analyze
{
  "analyzer": "pattern",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
// 預設是 按照 \w+ 正則
[ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]

8.1 Definition

Tokennizer

  • Pattern Tokenizer

Token Filters

  • Lower Case Token Filter
  • Stop Token Filter (預設未開啟)

8.2 Configuration

pattern A Java regular expression, defaults to \W+.
flags Java regular expression.
lowercase 轉小寫 預設開啟 true.
stopwords 停頓詞過濾 預設none 未開啟 , Defaults to _none_.
stopwords_path 停頓詞文件路徑

8.3 實驗

Pattern Analyzer 的實現 就是如下

PUT /pattern_example
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "split_on_non_word": {
          "type":       "pattern",
          "pattern":    "\\W+" 
        }
      },
      "analyzer": {
        "rebuilt_pattern": {
          "tokenizer": "split_on_non_word",
          "filter": [
            "lowercase"       
          ]
        }
      }
    }
  }
}

9. Language Analyzer

提供瞭如下 這麼多語言分詞器 , 其中 english 也在其中

arabic, armenian, basque, bengali, bulgarian, catalan, czech, dutch, english, finnish, french, galician, german, hindi, hungarian, indonesian, irish, italian, latvian, lithuanian, norwegian, portuguese, romanian, russian, sorani, spanish, swedish, turkish.

GET _analyze
{
  "analyzer": "english",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
[ 2, quick, brown, foxes, jumped, over, lazy, dog, bone ]

10. Customer Analyzer

沒啥好說的 就是當提供的 內置分詞器不滿足你的需求的時候 ,你可以結合 如下3部分

  • Character Filters : 主要對原文本做處理, 例如 去除 html 標簽
  • Tokenizer : 按照規則 把文本切分為單詞, 也就是分詞
  • Token Filters : 將切分後的單詞 進行加工處理, 小寫,刪除stopwords 停頓詞, 增加同義詞 , 擴展一些
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type": "custom",
          "char_filter": [
            "emoticons" 
          ],
          "tokenizer": "punctuation", 
          "filter": [
            "lowercase",
            "english_stop" 
          ]
        }
      },
      "tokenizer": {
        "punctuation": { 
          "type": "pattern",
          "pattern": "[ .,!?]"
        }
      },
      "char_filter": {
        "emoticons": { 
          "type": "mapping",
          "mappings": [
            ":) => _happy_",
            ":( => _sad_"
          ]
        }
      },
      "filter": {
        "english_stop": { 
          "type": "stop",
          "stopwords": "_english_"
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_custom_analyzer",
  "text":     "I'm a :) person, and you?"
}

[ i'm, _happy_, person, you ]

總結

本篇主要介紹了 Elasticsearch 中 的一些 內置的 Analyzer 分詞器, 這些內置分詞器可能不會常用,但是如果你能好好梳理一下這些內置 分詞器,一定會對你理解Analyzer 有很大的幫助, 可以幫助你理解 Character Filters , Tokenizer 和 Token Filters 的用處.

有機會再聊聊 一些中文分詞器 如 IKAnalyzer, ICU Analyzer ,Thulac 等等.. 畢竟開發中 中文分詞器用到更多些

歡迎大家訪問 個人博客 Johnny小屋
歡迎關註個人公眾號

歡迎關註個人公眾號


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.2 基礎變數聲明 /* 例1.2-1: 變數聲明 */ public class demo01 { public static void main(String[] args) { // 聲明類型 標識符 = 類型量; // 聲明整數型 int integers = 1; // 聲明一個int( ...
  • 2022-11-03 一、base標簽 1、作用:用於添加web項目的首碼。 2、放置位置:放置在head標簽內部,一般放在首行。 3、使用方式:<base href="/項目名稱/">,在html網頁中的其他(例如:圖片,超鏈接...)使用下相對路徑的前面將“./”去掉。因為它是指的是base 之 ...
  • 簡單場景舉例 聚合工程創建示例 說明: 創建 Maven Project:表示創建 maven 項目,new Project 方式創建 創建 Maven Module:表示創建 maven 項目,new Module 方式創建 創建 SpringBoot Module:表示創建 SpringBoot ...
  • 作者:張富春(ahfuzhang),轉載時請註明作者和引用鏈接,謝謝! cnblogs博客 zhihu Github 公眾號:一本正經的瞎扯 首先,我希望所有golang中用於http請求響應的結構,都使用proto3來定義。 麻煩的是,有的情況下某個欄位的類型可能是動態的,對應的JSON類型可能是 ...
  • 哈嘍兄弟們,今天我們來複習下變數。 首先嘗試在一個hello_world.py文件中使用變數,在文件開頭添加一行代碼,並對第二行代碼進行修改,如下所示: message="hello world" print(message) # Python源碼/教程領取扣君羊:279199867 運行這個程式, ...
  • 一.subprocess模塊 subprocess是Python 2.4中新增的一個模塊,它允許你生成新的進程,連接到它們的 input/output/error 管道,並獲取它們的返回(狀態)碼。這個模塊的目的在於替換幾個舊的模塊和方法,如: os.system os.spawn* 1.subpr ...
  • Python這門語言很適合用來寫些實用的小腳本,跑個自動化、爬蟲、演算法什麼的,非常方便。 這也是很多人學習Python的樂趣所在,可能只需要花個禮拜入門語法,就能用第三方庫去解決實際問題。我在Github上就看到過不少Python代碼的項目,幾十行代碼就能實現一個場景功能,非常實用。 比方說倉庫Py ...
  • 一、爬蟲的步驟 1、 需求分析(人做) 2、尋找網站(人)3、下載網站的返回內容(requests)4、通過返回的信息找到需要爬取的數據內容(正則表達式-re,xpath-lxml)5、存儲找到的數據內容(mysql) 二、requests import requests url = 'http:/ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...