999 - Elasticsearch Analysis 03 - Tokenizer

Word Oriented Tokenizers

下面的tokenizer主要用来切分文本为单个单词。

Standard Tokenizer

  • 默认的analyzer,适合大多数语言。
  • 根据Unicode Text Segmentation算法的定义,将文本切分成词元。
  • 示例
POST _analyze
{
  "tokenizer": "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 ]

  • 配置参数
参数 说明
max_token_length 词元的长度,超过会被分割。默认255。

示例

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "standard",
          "max_token_length": 5
        }
      }
    }
  }
}

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

产生[ The, 2, QUICK, Brown, Foxes, jumpe, d, over, the, lazy, dog's, bone ]

Letter Tokenizer

  • 按非字母的切分。
  • 示例
POST _analyze
{
  "tokenizer": "letter",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

产生[ The, QUICK, Brown, Foxes, jumped, over, the, lazy, dog, s, bone ]

Lowercase Tokenizer

  • 相当于letter tokenizer+lowercase token filter
  • 示例
POST _analyze
{
  "tokenizer": "lowercase",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

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

Whitespace Tokenizer

  • 按空格切分。
  • 示例
POST _analyze
{
  "tokenizer": "whitespace",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
  • 配置参数
参数 说明
max_token_length 词元的长度,超过会被分割。默认255。

UAX URL Email Tokenizer

  • 类似standard tokenizer,只是能够识别邮件地址、URL。
  • 示例
POST _analyze
{
  "tokenizer": "uax_url_email",
  "text": "Email me at john.smith@global-international.com"
}

产生[ Email, me, at, john.smith@global-international.com ]

如果是standard tokenizer将产生[ Email, me, at, john.smith, global, international.com ]

  • 配置参数
参数 说明
max_token_length 词元的长度,超过会被分割。默认255。

示例

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer":{
          "type": "uax_url_email",
          "max_token_length": 5
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "john.smith@global-international.com"
}

产生[ john, smith, globa, l, inter, natio, nal.c, om ]

Partial Word Tokenizers

这些Tokenizer主要将单词或者文本截取成更小的分段。

N-Gram Tokenizer

  • 指定保留的字符类型(通过参数token_chars指定,默认[]保留所有),以及根据min_gram以及max_gram指定切分时最小几个字符、最大几个字符。

  • 像一个滑动窗口,例如min_gram为1,max_gram为3,对于Quick这个单词,就会变成[ Q, Qu, Qui, u, ui, uic, i, ic, ick, c, ck, k ]。长度越短,切分出来越少,更多的被匹配到质量也越差;长度越长,切分出来越多,匹配越精确。

  • 示例

POST _analyze
{
  "tokenizer": "ngram",
  "text": "Quick Fox"
}

产生[ Q, Qu, u, ui, i, ic, c, ck, k, "k ", " ", " F", F, Fo, o, ox, x ]

  • 配置参数
参数 说明
min_gram 字符的最小长度。默认为1。
max_gram 字符的最大长度。默认为2。
token_chars 字符组见下表。分词时,保留指定的字符组,并根据没有指定的字符组进行切分。例如指定了letter、digit字符组,就会根据whitespace、punctuation、symbol进行切分。
字符组 说明
letter 例如 a, b, ï or 京
digit 例如 3 or 7
whitespace 例如 " " or "\n"
punctuation 例如 ! or "
symbol 例如 $ or √

示例:保留数字,最小长度是1,最大是3。

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer":{
          "type": "ngram",
          "min_gram": 1,
          "max_gram": 3,
          "token_chars": [
            "digit"
            ]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "2 Quick Foxes."
}

产生[ 2 ]

示例:保留数字和字母,最小最大长度都是3。因为数字2长度为1,小于3,所以结果中没有数字,只剩下字母。

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 3,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "2 Quick Foxes."
}

产生[ Qui, uic, ick, Fox, oxe, xes ]

Edge N-Gram Tokenizer

  • ngram tokenizer相同,只不过只从单词头开始。例如,min_gram为1,max_gram为3,对于Quick这个单词,就会变成[ Q, Qu, Qui ]
  • 示例

默认配置:token_chars默认为[]保留全部,不拆分也就是Quick Fox作为一整个单词,min_gram为1,max_gram为2

POST _analyze
{
  "tokenizer": "edge_ngram",
  "text": "Quick Fox"
}

产生[ Q, Qu ]

配置示例

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 10,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "2 Quick Foxes."
}

产生[ Qu, Qui, Quic, Quick, Fo, Fox, Foxe, Foxes ]

Structured Text Tokenizers

适用于结构化文本(例如邮箱、身份证等)

Keyword Tokenizer

  • 原模原样不变。
  • 示例
POST _analyze
{
  "tokenizer": "keyword",
  "text": "New York"
}

产生[ New York ]

  • 配置参数
参数 说明
buffer_size 缓冲区大小。默认256。
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer":{
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "keyword",
          "buffer_size": 2
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer", 
  "text": "New York"
}

产生[ New York ]

Pattern Tokenizer

  • 可以按照正则表达式切分,也可以按照正则表达式提取。

  • 示例

POST _analyze
{
  "tokenizer": "pattern",
  "text": "The foo_bar_size's default is 5."
}

产生[ The, foo_bar_size, s, default, is, 5 ]

  • 配置参数
参数 说明
pattern 使用Java正则表达式。默认\W+
flags Java正则表达式flags,多个用|分离,例如"CASE_INSENSITIVE | COMMENTS"。
group 将哪个捕获分组作为词元。默认是 -1,相当于split。

Char Group Tokenizer

  • 根据定义的字符切分。
  • 配置参数
参数 说明
tokenize_on_chars 用来切分的字符。可以使用单个例如-,也可以使用字符组:whitespaceletterdigitpunctuationsymbol
POST _analyze
{
  "tokenizer": {
    "type": "char_group",
    "tokenize_on_chars": [
      "whitespace",
      "-"
    ]
  },
  "text": "The QUICK brown-fox"
}

产生[ The, QUICK, brown, fox ]

Simple Pattern Tokenizer

  • 使用Lucene regular expressions捕获文本,比pattern tokenizer受限(pattern tokenizer既可以捕获又可以切分),但是更快。
  • 配置参数
参数 说明
pattern 使用Lucene regular expressions。默认空字符串,不捕获,输出空条件。
POST _analyze
{
  "tokenizer": {
    "type": "simple_pattern",
    "pattern": "[0123456789]{2}"
  },
  "text": "fd-786-335-514-x"
}

产生[ 78, 33, 51 ]

Simple Pattern Split Tokenizer

  • 使用Lucene regular expressions切分文本,比pattern tokenizer受限(pattern tokenizer既可以捕获又可以切分),但是更快。
  • 配置参数
参数 说明
pattern 使用Lucene regular expressions。默认空字符串,不切分,整条输出。
POST _analyze
{
  "tokenizer": {
    "type": "simple_pattern_split",
    "pattern": "_"
  },
  "text": "an_underscored_phrase"
}

产生[ an, underscored, phrase ]

Path Tokenizer

  • 切分类似文件系统路径的值。
  • 示例
POST _analyze
{
  "tokenizer": "path_hierarchy",
  "text": "/one/two/three"
}

产生[ /one, /one/two, /one/two/three ]

  • 配置参数
参数 说明
delimiter 路径分隔符。默认/
replacement 分割后用来替换的分隔符。默认与delimiter一致。
buffer_size 缓冲大小。默认1024
reverse true则从相反顺序切分。默认fasle。例如,one/two/three默认情况下切分为[ one, one/two, one/two/three ],设为true,则结果为[ one/two/three, two/three, three ]
skip 跳过多少个。默认0
POST _analyze
{
  "tokenizer": {
    "type": "path_hierarchy",
    "delimiter": "-",
    "replacement": "/",
    "skip": 2
  },
  "text": "one-two-three-four-five"
}

产生[ /three, /three/four, /three/four/five ]

设置reversetrue,产生[ one/two/three/, two/three/, three/ ]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容