# 模式分析器

原文链接 : [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
  )

```