Pattern Tokenizer

Pattern Tokenizer 使用正则表达式分割文本。遇到单词分隔符将文本分割为词元, 或者将捕获到匹配的文本作为词元。

默认的匹配模式时 \W+ ,遇到非单词的字符时分割文本。

谨防病态的正则表达式

Pattern Tokenizer 使用 Java 正则表达式

一个书写不当的正则表达式会导致运行缓慢,甚至抛出 StackOverflowError 导致运行中的节点突然退出。

查看更多关于 病态的正则表达式 和 如何避免。

原文链接 : https://www.elastic.co/guide/en/elasticsearch/reference/5.3/analysis-pattern-tokenizer.html

译文链接 : http://www.apache.wiki/display/Elasticsearch/Pattern+Tokenizer

贡献者 : 陈益雷ApacheCNApache中文网

输出示例

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

上面的句子会生成如下的词元:

  1. [ The, foo_bar_size, s, default, is, 5 ]

配置

Pattern Tokenizer 有以下参数:

| pattern | Java 正则表达式 。默认是 \W+ 。 | | flags | Java正则表达式 flags. flag之间用管道分隔, 如 "CASE_INSENSITIVE|COMMENTS"。 | | group | 将哪个捕获分组作为词元。默认是 -1。 |

配置示例

下面的例子中,我们配置 Pattern Tokenizer 遇到逗号时分隔文本。

  1. PUT my_index
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "my_tokenizer"
  8. }
  9. },
  10. "tokenizer": {
  11. "my_tokenizer": {
  12. "type": "pattern",
  13. "pattern": ","
  14. }
  15. }
  16. }
  17. }
  18. }
  19. POST my_index/_analyze
  20. {
  21. "analyzer": "my_analyzer",
  22. "text": "comma,separated,values"
  23. }

输出为:

  1. [ comma, separated, values ]

在下一个例子中,我们配置 Pattern Tokenizer 遇到双引号( 忽视转义的引号 \” ) 时捕获分组。正则表达式如下:

  1. "((?:\\"|[^"]|\\")*)"

解释:

  • 起始的引号 “
  • 开始捕获
    • 一个 \” 或者其他 非” 的字符
    • 重复直到无法匹配更多的字符
  • 结束的引号

在写入到 JSON 中, \ 需要转义,因此表达式最终为:

  1. \"((?:\\\\\"|[^\"]|\\\\\")+)\"
  1. PUT my_index
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "my_tokenizer"
  8. }
  9. },
  10. "tokenizer": {
  11. "my_tokenizer": {
  12. "type": "pattern",
  13. "pattern": "\"((?:\\\\\"|[^\"]|\\\\\")+)\"",
  14. "group": 1
  15. }
  16. }
  17. }
  18. }
  19. }
  20. POST my_index/_analyze
  21. {
  22. "analyzer": "my_analyzer",
  23. "text": "\"value\", \"value with embedded \\\" quote\""
  24. }

输出为:

  1. [ value, value with embedded \" quote ]