模式分析器
原文链接 : https://www.elastic.co/guide/en/elasticsearch/reference/5.3/analysis-pattern-analyzer.html(修改该链接为官网对应的链接)
译文链接 : http://www.apache.wiki/display/Elasticsearch/analysis-pattern-analyzer.html(修改该链接为 ApacheCN 对应的译文链接)
贡献者 : @您的名字,ApacheCN,Apache中文网
pattern analyzer 使用正则表达式将文本拆分为词语。 正则表达式应该不是token本身匹配 token separators 。 正则表达式默认为\ W +(或所有非字符字符)。
Beware of Pathological 正则表达式
pattern analyzer 使用java正则表达式
一个严重的正则表达式可能会运行得非常慢,甚至会抛出一个StackOverflowError,并导致它正在运行的节点突然退出。
阅读更多关于pathological正则表达式和如何避免它们。
定义
它包括:
分词器
词语过滤器
输出实例
POST _analyze{"analyzer": "pattern","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 ]
配置
pattern analyzer 接受以下参数:
pattern Java正则表达式默认为\ W +。
flags Java正则表达式标志。 标志应分开管道,例如“CASE_INSENSITIVE | COMMENTS”。
lowercase 是否应该降低条件? 默认为true。
stopwords 预定义的 stop 词列表,如english或包含停止词列表的数组。 默认为\ none。
stopwords_path 包含停止词的文件的路径。
有关stop word配置的更多信息,请参阅Stop Token Filter。
配置实例
在这个例子中,我们配置了模式分析器来分割非字符字符或下划线(\ W | _)的电子邮件地址,并将结果缩小:
PUT my_index{"settings": {"analysis": {"analyzer": {"my_email_analyzer": {"type": "pattern","pattern": "\\W|_","lowercase": true}}}}}POST my_index/_analyze{"analyzer": "my_email_analyzer","text": "John_Smith@foo-bar.com"}
1>当将模式指定为JSON字符串时,模式中的反斜杠需要转义。
上述的句子将产生以下的词语:
[ john, smith, foo, bar, com ]
CamelCase 分词器
以下更复杂的示例将 CamelCase 文本分成token:
PUT my_index{"settings": {"analysis": {"analyzer": {"camel": {"type": "pattern","pattern": "([^\\p{L}\\d]+)|(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)|(?<=[\\p{L}&&[^\\p{Lu}]])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}[\\p{L}&&[^\\p{Lu}]])"}}}}}GET my_index/_analyze{"analyzer": "camel","text": "MooseX::FTPClass2_beta"}
上述的句子将产生以下的词语:
[ moose, x, ftp, class, 2, beta ]
上面的正则表达式比较容易理解为:
([^\p{L}\d]+) # swallow non letters and numbers,| (?<=\D)(?=\d) # or non-number followed by number,| (?<=\d)(?=\D) # or number followed by non-number,| (?<=[ \p{L} && [^\p{Lu}]]) # or lower case(?=\p{Lu}) # followed by upper case,| (?<=\p{Lu}) # or upper case(?=\p{Lu} # followed by upper case[\p{L}&&[^\p{Lu}]] # then lower case)
