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
输出示例
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 ]
