Elasticsearch 分詞器

在全文搜索(Fulltext Search)中拯辙,詞(Term)是一個搜索單元丰涉,表示文本中的一個詞,標記(Token)表示在文本字段中出現(xiàn)的詞涎永,由詞的文本思币、在原始文本中的開始和結(jié)束偏移量、以及數(shù)據(jù)類型等組成羡微。ElasticSearch 把文檔數(shù)據(jù)寫到倒排索引(Inverted Index)的結(jié)構(gòu)中谷饿,倒排索引建立詞(Term)和文檔之間的映射读串,索引中的數(shù)據(jù)是面向詞狞甚,而不是面向文檔的。分析器(Analyzer)的作用就是分析(Analyse)加袋,用于把傳入Lucene的文檔數(shù)據(jù)轉(zhuǎn)化為倒排索引盯蝴,把文本處理成可被搜索的詞毅哗。

在ElasticSearch引擎中,分析器的任務是分析(Analyze)文本數(shù)據(jù)捧挺,分析是分詞虑绵,規(guī)范化文本的意思,其工作流程是:

  1. 首先松忍,字符過濾器對分析(analyzed)文本進行過濾和處理蒸殿,例如從原始文本中移除HTML標記,根據(jù)字符映射替換文本等鸣峭,

  2. 過濾之后的文本被分詞器接收宏所,分詞器把文本分割成標記流,也就是一個接一個的標記摊溶,

  3. 然后爬骤,標記過濾器對標記流進行過濾處理,例如莫换,移除停用詞霞玄,把詞轉(zhuǎn)換成其詞干形式,把詞轉(zhuǎn)換成其同義詞等拉岁,

  4. 最終坷剧,過濾之后的標記流被存儲在倒排索引中;

  5. ElasticSearch引擎在收到用戶的查詢請求時喊暖,會使用分析器對查詢條件進行分析惫企,根據(jù)分析的結(jié)構(gòu),重新構(gòu)造查詢,以搜索倒排索引狞尔,完成全文搜索請求丛版。

無論是內(nèi)置的分析器(analyzer),還是自定義的分析器(analyzer)偏序,都由三種構(gòu)件塊組成的:**character filters 页畦,tokenizers **和 token filters

  • **character filters **

    字符過濾器以字符流的形式接收原始文本研儒,并可以通過添加豫缨、刪除或更改字符來轉(zhuǎn)換該流。

    舉例來說殉摔,一個字符過濾器可以用來把阿拉伯數(shù)字(??????????)轉(zhuǎn)成成Arabic-Latin的等價物(0123456789)州胳。

    一個分析器可能有0個或多個字符過濾器,它們按順序應用逸月。

  • Tokenizer (分詞器)

    一個分詞器接收一個字符流,并將其拆分成單個token (通常是單個單詞)遍膜,并輸出一個token流碗硬。例如,一個whitespace分詞器當它看到空白的時候就會將文本拆分成token瓢颅。它會將文本“Quick brown fox!”轉(zhuǎn)換為[Quick, brown, fox!]

    (PS:Tokenizer 負責將文本拆分成單個token 恩尾,這里token就指的就是一個一個的單詞。就是一段文本被分割成好幾部分 )

    分詞器還負責記錄每個term的順序或位置挽懦,以及該term所表示的原單詞的開始和結(jié)束字符偏移量翰意。(PS:文本被分詞后的輸出是一個term數(shù)組)

    一個分析器必須只能有一個分詞器

  • Token filters (token過濾器)

    token過濾器接收token流,并且可能會添加信柿、刪除或更改tokens冀偶。

    例如,一個lowercase token filter可以將所有的token轉(zhuǎn)成小寫渔嚷。stop token filter可以刪除常用的單詞进鸠,比如 the 。synonym token filter可以將同義詞引入token流形病。

    不允許token過濾器更改每個token的位置或字符偏移量客年。

    一個分析器可能有0個或多個token過濾器,它們按順序應用漠吻。

ES內(nèi)置分詞器(Tokenizer)

分詞器在字符過濾器之后工作量瓜,用于把文本分割成多個標記(Token),一個標記基本上是詞加上一些額外信息途乃,分詞器的處理結(jié)果是標記流,它是一個接一個的標記唧取,準備被過濾器處理枫弟。

  • 標準分析器(Standard)

    分析器類型是standard骇塘,由標準分詞器(Standard Tokenizer)韩容,標準標記過濾器(Standard Token Filter),小寫標記過濾器(Lower Case Token Filter)和停用詞標記過濾器(Stopwords Token Filter)組成插爹。參數(shù)stopwords用于初始化停用詞列表请梢,默認是空的。

  • 簡單分析器(Simple)

    分析器類型是simple,實際上是小寫標記分詞器(Lower Case Tokenizer)寸宵,在非字母位置上分割文本梯影,并把分詞轉(zhuǎn)換為小寫形式光酣,功能上是Letter Tokenizer和 Lower Case Token Filter的結(jié)合(Combination),但是性能更高脉课,一次性完成兩個任務唱遭。

  • 空格分析器(Whitespace)

    分析器類型是whitespace,實際上是空格分詞器(Whitespace Tokenizer)。

  • 停用詞分析器(Stopwords)

    分析器類型是stop脂矫,由小寫分詞器(Lower Case Tokenizer)和停用詞標記過濾器(Stop Token Filter)構(gòu)成庭再,配置參數(shù)stopwords或 stopwords_path指定停用詞列表颅围。

  • 雪球分析器(Snowball)

    分析器類型是snowball奶卓,由標準分詞器(Standard Tokenizer),標準過濾器(Standard Filter)掌猛,小寫過濾器(Lowercase Filter),停用詞過濾器(Stop Filter)和雪球過濾器(Snowball Filter)構(gòu)成孔飒。參數(shù)language用于指定語言。

  • 自定義分析器

    分析器類型是custom鸠匀,允許用戶定制分析器蕉斜。參數(shù)tokenizer 用于指定分詞器,filter用于指定過濾器,char_filter用于指定字符過濾器宅此。

內(nèi)置分析器實例

這里我們使用的工具是Kibana机错,我們在這里來操作一下Elasticsearch。如下的事例是ES默認的標準分析器父腕,我們使用_analyze來調(diào)試實驗一下弱匪。

POST _analyze
{
    "analyzer": "standard",
    "text": "I am Chinese."
}

輸出如下結(jié)果:

{
  "tokens" : [
    {
      "token" : "i",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "am",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "chinese",
      "start_offset" : 5,
      "end_offset" : 12,
      "type" : "<ALPHANUM>",
      "position" : 2
    }
  ]
}

而使用空格分析器的話,就會對每個空格進行分割侣诵,如下

POST _analyze
{
  "analyzer": "whitespace",
  "text": "I'm Chinese."
}

輸出結(jié)果:

{
  "tokens" : [
    {
      "token" : "I'm",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "Chinese.",
      "start_offset" : 4,
      "end_offset" : 12,
      "type" : "word",
      "position" : 1
    }
  ]
}

接下來我們創(chuàng)建一個自定義分析器:

# 創(chuàng)建一個自定義分詞器
PUT test_index_1
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_anaylzer" : {
          "type" : "custom",
          "tokenizer" : "standard",
          "char_filter" : ["html_strip"],
          "filter" : ["lowercase"]
        }
      }
    }
  }
}

以上代碼是創(chuàng)建一個自定義分析器痢法,其中使用分析器是標準分析器,字符串過濾使用的是html_strip(去除里面的html標簽內(nèi)容)杜顺,token過濾器用的是lowercase财搁,也就是把取出來的字符都轉(zhuǎn)成小寫。運行如下事例躬络。

POST test_index_1/_analyze
{
  "analyzer" : "my_custom_anaylzer",
  "text" : "Is this <b> a box <b>?"
}

輸出結(jié)果為:

{
  "tokens" : [
    {
      "token" : "is",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "this",
      "start_offset" : 3,
      "end_offset" : 7,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "a",
      "start_offset" : 12,
      "end_offset" : 13,
      "type" : "<ALPHANUM>",
      "position" : 2
    },
    {
      "token" : "box",
      "start_offset" : 14,
      "end_offset" : 17,
      "type" : "<ALPHANUM>",
      "position" : 3
    }
  ]
}

參考

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenfilters.html

https://github.com/medcl/elasticsearch-analysis-ik

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尖奔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子穷当,更是在濱河造成了極大的恐慌提茁,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馁菜,死亡現(xiàn)場離奇詭異茴扁,居然都是意外死亡,警方通過查閱死者的電腦和手機汪疮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門峭火,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人智嚷,你說我怎么就攤上這事卖丸。” “怎么了盏道?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵稍浆,是天一觀的道長。 經(jīng)常有香客問我猜嘱,道長衅枫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任泉坐,我火速辦了婚禮为鳄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腕让。我一直安慰自己孤钦,他們只是感情好歧斟,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著偏形,像睡著了一般静袖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俊扭,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天队橙,我揣著相機與錄音,去河邊找鬼萨惑。 笑死捐康,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的庸蔼。 我是一名探鬼主播解总,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姐仅!你這毒婦竟也來了花枫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤掏膏,失蹤者是張志新(化名)和其女友劉穎劳翰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馒疹,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡佳簸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了颖变。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溺蕉。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悼做,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哗魂,我是刑警寧澤肛走,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站录别,受9級特大地震影響朽色,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜组题,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一葫男、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧崔列,春花似錦梢褐、人聲如沸旺遮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耿眉。三九已至,卻和暖如春鱼响,著一層夾襖步出監(jiān)牢的瞬間鸣剪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工丈积, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留筐骇,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓江滨,卻偏偏與公主長得像铛纬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子牙寞,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容