企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 模式分析器 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>当将模式指定为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` `)` |