Elasticsearch之文本分析

文本分析基本概念

官網:Text analysis | Elasticsearch Guide [7.17] | Elastic

? ? ? ? 官網稱為文本分析,這是對文本進行一直分析處理的方式,基本處理邏輯是為按照預先制定的分詞規則,把原本的文檔進行分割成多個小顆粒度的詞項,顆粒度的大小取決于分詞器的配置規則。

不同文本分析結果如下:

POST _analyze
{"analyzer":"standard","text":"中華人民共和國"
}

#ik_smart:會做最粗粒度的拆
POST _analyze
{"analyzer": "ik_smart","text": "中華人民共和國"}

#ik_max_word:會將文本做最細粒度的拆分
POST _analyze
{"analyzer":"ik_max_word","text":"中華人民共和國"
}

文本分析發生時間

Index and search analysis | Elasticsearch Guide [7.17] | Elastic

文本分析處理發生在 Index Time 和 Search Time 兩個時間。

  1. Index Time:文本寫入并創建倒排索引時期,其分詞邏輯取決于映射參數analyzer。
  2. Search Time:搜索執行時期,其分詞僅對搜索詞產生作用。

文本分析構成

Anatomy of an analyzer | Elasticsearch Guide [7.17] | Elastic

  • 切詞器(Tokenizer):定義切詞(分詞)邏輯
  • 詞項過濾器(Token Filter):分詞之后的單個詞項的處理邏輯
  • 字符過濾器(Character Filter):處理單個字符

分詞器:Tokenizer

????????tokenizer 是文本分析的核心組成部分之一,其主要作用是分詞,或稱之為切詞。主要用來對原始文本進行細粒度拆分。拆分之后的每一個部分稱之為一個 Term,或稱之為一個詞項。可以把切詞器理解為預定義的切詞規則。官方內置了很多種切詞器,默認標準切詞器standard。

詞項過濾器:Token Filter

????????詞項過濾器用來處理切詞完成之后的詞項,例如把大小寫轉換,刪除停用詞或同義詞處理等。官方同樣預置了很多詞項過濾器,基本可以滿足日常開發的需要。當然也是支持第三方也自行開發的。

停用詞

在切詞完成之后,會被干掉詞項,即停用詞。停用詞可以自定義
英文停用詞(english):a, an, and, are, as, at, be, but, by, for, if, in, into, is, it, no, not, of, on,
or, such, that, the, their, then, there, these, they, this, to, was, will, with。
中日韓停用詞(cjk):a, and, are, as, at, be, but, by, for, if, in, into, is, it, no, not, of, on, or, s,
such, t, that, the, their, then, there, these, they, this, to, was, will, with, www。

GET _analyze
{
"tokenizer": "standard",
"filter": ["stop"],
"text": ["how are you"]
}

自定義過濾器


# 自定義 filter
DELETE test_token_filter_stop
PUT test_token_filter_stop
{"settings": {"analysis": {"filter": {"my_filter": {"type": "stop","stopwords": ["you"],"ignore_case": true}}}}
}
GET test_token_filter_stop/_analyze
{"tokenizer": "standard", "filter": ["my_filter"], "text": ["how are you"]
}

同義詞

同義詞定義規則:

  • a, b, c => d:這種方式,a、b、c 會被 d 代替。
  • a, b, c, d:這種方式下,a、b、c、d 是等價的。
PUT test_token_filter_synonym
{"settings": {"analysis": {"filter": {"my_synonym": {"type": "synonym","synonyms": [ "good, nice => excellent" ] //good, nice, excellent}}}}
}
GET test_token_filter_synonym/_analyze
{"tokenizer": "standard", "filter": ["my_synonym"], "text": ["good"]
}

字符過濾器:Character Filter

分詞之前的預處理,過濾無用字符。

PUT <index_name>
{"settings": {"analysis": {"char_filter": {"my_char_filter": {"type": "<char_filter_type>"}}}}
}

type:使用的字符過濾器類型名稱,可配置以下值:

  • html_strip
  • mapping
  • pattern_replace

HTML 標簽過濾器:HTML Strip Character Filter

字符過濾器會去除 HTML 標簽和轉義 HTML 元素,如?、&

PUT test_html_strip_filter
{"settings": {"analysis": {"char_filter": {"my_char_filter": {"type": "html_strip",  // html_strip 代表使用 HTML 標簽過濾器"escaped_tags": [     // 當前僅保留 a 標簽        "a"]}}}}
}
GET test_html_strip_filter/_analyze
{"tokenizer": "standard", "char_filter": ["my_char_filter"],"text": ["<p>I&apos;m so <a>happy</a>!</p>"]
}

參數:escaped_tags:需要保留的 html 標簽

字符映射過濾器:Mapping Character Filter

通過定義映替換為規則,把特定字符替換為指定字符

PUT test_html_strip_filter
{"settings": {"analysis": {"char_filter": {"my_char_filter": {"type": "mapping",    // mapping 代表使用字符映射過濾器"mappings": [                // 數組中規定的字符會被等價替換為 => 指定的字符"滾 => *","垃 => *","圾 => *"]}}}}
}
GET test_html_strip_filter/_analyze
{//"tokenizer": "standard", "char_filter": ["my_char_filter"],"text": "你個垃圾廢物!滾"
}

正則替換過濾器:Pattern Replace Character Filter

PUT text_pattern_replace_filter
{"settings": {"analysis": {"char_filter": {"my_char_filter": {"type": "pattern_replace",    // pattern_replace 代表使用正則替換過濾器            "pattern": """(\d{3})\d{4}(\d{4})""",    // 正則表達式"replacement": "$1****$2"}}}}
}
GET text_pattern_replace_filter/_analyze
{"char_filter": ["my_char_filter"],"text": "手機號是18868686688"
}

倒排索引的數據結構

????????當數據寫入 ES 時,數據將會通過?分詞?被切分為不同的?term,ES 將 term 與其對應的文檔列表建立一種映射關系,這種結構就是?倒排索引。

????????為了進一步提升索引的效率,ES 在 term 的基礎上利用 term 的前綴或者后綴構建了 term index, 用于對 term 本身進行索引,ES 實際的索引結構如下圖所示:

????????這樣當我們去搜索某個關鍵詞時,ES 首先根據它的前綴或者后綴迅速縮小關鍵詞的在 term dictionary 中的范圍,大大減少了磁盤IO的次數。

  • 單詞詞典(Term Dictionary) :記錄所有文檔的單詞,記錄單詞到倒排列表的關聯關系
    • 常用字典數據結構:
    • 數據結構優缺點
      排序列表Array/List使用二分法查找,不平衡
      HashMap/TreeMap性能高,內存消耗大,幾乎是原始數據的三倍
      Skip List跳躍表,可快速查找詞語,在lucene、redis、Hbase等均有實現。相對于TreeMap等結構,特別適合高并發
      Trie適合英文詞典,如果系統中存在大量字符串且這些字符串基本沒有公共前綴,則相應的trie樹將非常消耗內存
      Double Array Trie適合做中文詞典,內存占用小,很多分詞工具均采用此種算法
      Ternary Search Tree三叉樹,每一個node有3個節點,兼具省空間和查詢快的優點
      Finite State Transducers (FST)一種有限狀態轉移機,Lucene 4有開源實現,并大量使用
  • 倒排列表(Posting List)-記錄了單詞對應的文檔結合,由倒排索引項組成
  • 倒排索引項(Posting):
    • 文檔ID
    • 詞頻TF–該單詞在文檔中出現的次數,用于相關性評分
    • 位置(Position)-單詞在文檔中分詞的位置。用于短語搜索(match phrase query)
    • 偏移(Offset)-記錄單詞的開始結束位置,實現高亮顯示

Elasticsearch 的JSON文檔中的每個字段,都有自己的倒排索引。

可以指定對某些字段不做索引:

  • 優點︰節省存儲空間
  • 缺點: 字段無法被搜索

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18302.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18302.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18302.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python pands使用引擎實現excel條件格式

截至我的知識更新日期&#xff08;2023年&#xff09;&#xff0c;Pandas 庫本身并不直接支持Excel條件格式。Pandas 是一個強大的Python數據分析庫&#xff0c;它主要用于數據分析和操作&#xff0c;而不是用于創建或編輯Excel文件的格式。 然而&#xff0c;你可以使用 openp…

如何給出好的“文言一心”指令?

一、文言一心是什么&#xff1f; 在現代技術背景下&#xff0c;“文言一心”還是百度公司創建的一款大語言模型。這款模型基于飛槳深度學習平臺和文心知識增強大模型&#xff0c;并擁有強大的中文語料庫&#xff0c;可以理解和生成富含文化內涵和哲理的文本內容。其核心技術架構…

社區醫院|基于SprinBoot+vue的社區醫院管理服務系統(源碼+數據庫+文檔)

社區醫院管理服務系統 目錄 基于SprinBootvue的社區醫院管理服務系統 一、前言 二、系統設計 三、系統功能設計 1系統功能模塊 2管理員功能模塊 3用戶功能模塊 4醫生功能模塊 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取…

看花眼,眼花繚亂的主食凍干到底應該怎么選?靠譜的主食凍干分享

隨著科學養貓知識的普及&#xff0c;主食凍干喂養越來越受到養貓人的青睞。主食凍干不僅符合貓咪的飲食天性&#xff0c;還能提供均衡的營養&#xff0c;有助于維護貓咪的口腔和消化系統健康。許多貓主人認識到了主食凍干喂養的諸多益處&#xff0c;計劃嘗試這種喂養方式&#…

學英語材料:單口喜劇、講故事、短劇喜劇以及廣播劇和播客節目

學習英語節目 有名的單口喜劇、講故事、短劇喜劇以及廣播劇和播客節目&#xff1a; 單口喜劇&#xff08;Stand-up Comedy&#xff09; 描述&#xff1a;這是最接近相聲的形式&#xff0c;表演者獨自一人站在舞臺上&#xff0c;用幽默的方式講述個人經歷、觀察到的社會現象或…

C++面向對象程序設計 - 標準輸出流

在C中&#xff0c;標準輸出流通常指的是與標準輸出設備&#xff08;通常是終端或控制臺&#xff09;相關聯的流對象。這個流對象在C標準庫中被定義為std::cout、std::err、std::clog&#xff0c;它們是std::ostream類的一個實例。 一、cout&#xff0c;cerr和clog流 ostream類…

echarts(6大基礎圖表)的使用

目錄 一、vue2掛載 二、柱狀圖 2.1、基礎柱狀圖介紹 2.2、標記&#xff1a;最大值\最小值(markPoint)、平均值(markLine) 2.3、顯示&#xff1a;數值顯示(label)、柱子寬度(barWidth)、橫向柱狀圖 三、折線圖 3.1、標記&#xff1a;最大值\最小值(markPoint)、平均值(ma…

R可視化:組間點圖比較

散點組間比較 散點組間比較 介紹 ggplot2繪制散點組間比較加載R包 knitr::opts_chunk$set(message = FALSE, warning = FALSE)library(tidyverse) library(ggplot2) library(ggprism) library(ggbeeswarm) library(rstatix)rm(list = ls()) options(stringsAsFactors = F) o…

android11禁止進入屏保和自動休眠

應某些客戶要求&#xff0c;關閉了開機進入屏保&#xff0c;一段時間會休眠的問題。以下diff可供參考&#xff1a; diff --git a/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/overlay/frameworks/base/packages/SettingsProvider/res/value…

Python3 筆記:repr() 函數

repr() 函數將對象轉化為供解釋器讀取的形式。 語法&#xff1a; repr(object) 返回一個對象的 string 格式。 tuple1 (1,2,3) print(type(repr((tuple1)))) # 運行結果&#xff1a;<class str> repr(str)與在字符串前加上“r”或“R”的原理有點相似&#xff0c;但…

node模塊的本質

對于一個模塊而言&#xff0c;有兩個關鍵的地方&#xff0c;一是有自己的作用域&#xff0c;二是有對外暴露的接口 不知道大家有沒有想過這樣一個問題&#xff0c;模塊是怎么實現上面兩個特性的呢&#xff1f;其實通過一個 立即執行函數 就可以了 實際上 Node 在編譯的時候&a…

常見5大開發進度盲點問題及解決方案

在軟件開發項目中&#xff0c;識別并解決常見的進度管理盲點問題&#xff0c;對于確保項目按時、按預算、高質量完成至關重要。它直接關系到項目能否順利進行&#xff0c;忽視任何一個問題&#xff0c;都可能導致項目延期、成本超支、質量下降&#xff0c;甚至項目失敗。 因此&…

IT技術培訓班:實用還是虛幻?

在學習IT技術的過程中&#xff0c;我經常被各種五花八門的技術培訓班所安利。這些培訓班以各種方式向我宣傳&#xff0c;聲稱可以快速提升技能、獲得認證、找到高薪工作等&#xff0c;讓我不禁懷疑&#xff1a;在培訓班里學技術真的有用嗎&#xff1f;我對此抱有怎樣的態度呢&a…

香橙派華為昇騰CANN架構編譯opencv4.9

香橙派華為升騰AI盒子 為啥要編譯opencv4.9.0&#xff0c; 因為在4.9.0 中增加了華為昇騰CANN的外接開發庫&#xff0c;下圖為盒子外觀&#xff0c;此次一接到這個盒子&#xff0c;立刻開始開箱操作&#xff0c;首先就是要編譯opencv4.9&#xff0c;以前在香橙派3588 的盒子中…

大模型應用:LLM基本原理及應用場景

1.背景 23年以來&#xff0c;隨著OpenAI公司的ChatGPT橫空出世&#xff0c;大模型一詞開始火爆全球。國內外以OpenAI、Google、百度、阿里、字節等大廠為代表&#xff0c;相繼推出一系列大模型及其應用&#xff0c;涉及社交、問答、代碼助手等多個方面。 目前主流的大模型及產…

Echarts - 多個頁面內有N個 echarts 圖表,封裝組件 CommonEcharts 快捷實現

目錄 子組件父組件使用注意 option 文件效果展示相關數據處理&#xff08;代碼備份 - 可不看&#xff09;數據處理后頁面展示 子組件 CommonEcharts.vue <template><div><div v-for"id in domId" :id"id" :key"id" class"…

代碼隨想錄算法訓練營Day53 | 1143.最長公共子序列、1035.不相交的線、53. 最大子序和 | Python | 個人記錄向

本文目錄 1143.最長公共子序列做題看文章 1035.不相交的線做題看文章 53. 最大子序和做題看文章 以往忽略的知識點小結個人體會 1143.最長公共子序列 代碼隨想錄&#xff1a;1143.最長公共子序列 Leetcode&#xff1a;1143.最長公共子序列 做題 無思路。 看文章 dp[i][j]&…

基于事件的架構工作機制和相關產品

基于事件的架構 基于事件的架構可否這樣理解&#xff0c;每個事件相當于傳統API的一次函數調用請求&#xff0c;比如Add(123,456)。區別在于&#xff0c;基于事件的架構只是把這個請求發出&#xff0c;并不急于得到結果&#xff0c;而是等合適的子系統處理完這個請求&#xff…

go select

select 是與 switch 相似的控制結構&#xff0c;與 switch 不同的是&#xff0c;select 中雖然也有多個 case&#xff0c;但是這些 case 中的表達式必須都是 channel 的收發操作。 select 能夠讓 goroutine 同時等待多個 channel 可讀或者可寫&#xff0c;在多個 channel 狀態改…

使用awk對nginx access.log進行統計分析

nginx可以配置訪問日志&#xff0c;如果我們要對日志文件進行統計分析&#xff0c;在linux環境下可以借助awk命令完成。 日志格式配置如下所示&#xff1a; log_format access_json {"timestamp":"$time_iso8601","host":"$server_addr&qu…