Pattern Tokenizer

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

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

谨防病态的正则表达式

Pattern Tokenizer 使用 Java 正则表达式

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

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

输出示例

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

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

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

配置

Pattern Tokenizer 有以下参数:

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

配置示例

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

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "pattern",
          "pattern": ","
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "comma,separated,values"
}

输出为:

[ comma, separated, values ]

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

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

解释:

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

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

\"((?:\\\\\"|[^\"]|\\\\\")+)\"
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "pattern",
          "pattern": "\"((?:\\\\\"|[^\"]|\\\\\")+)\"",
          "group": 1
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "\"value\", \"value with embedded \\\" quote\""
}

输出为:

[ value, value with embedded \" quote ]