企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 模式分析器 原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/5.3/analysis-pattern-analyzer.html](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/getting-started.html)(修改该链接为官网对应的链接) 译文链接 : [http://www.apache.wiki/display/Elasticsearch/analysis-pattern-analyzer.html](http://www.apache.wiki/display/Elasticsearch)(修改该链接为 **ApacheCN** 对应的译文链接) 贡献者 : @您的名字,[ApacheCN](/display/~apachecn),[Apache中文网](/display/~apachechina) pattern analyzer 使用正则表达式将文本拆分为词语。 正则表达式应该不是**token**本身匹配 **token separators** 。 正则表达式默认为\ W +(或所有非字符字符)。 ## **Beware of Pathological 正则表达式** pattern analyzer 使用java正则表达式 一个严重的正则表达式可能会运行得非常慢,甚至会抛出一个StackOverflowError,并导致它正在运行的节点突然退出。 阅读更多关于pathological正则表达式和如何避免它们。 ## **定义** 它包括: 分词器 * [Pattern Tokenizer](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/analysis-pattern-tokenizer.html "Pattern Tokenizer") 词语过滤器 * [Lower Case Token Filter](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/analysis-lowercase-tokenfilter.html "Lowercase Token Filter") * [Stop Token Filter](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/analysis-stop-tokenfilter.html "Stop Token Filter") (默认禁用) ## **输出实例** ``` 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&gt;当将模式指定为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 ) ```