模式分词器编辑

pattern 分词器使用正则表达式在匹配单词分隔符时将文本拆分为词条,或者将匹配的文本捕获为词条。

默认模式为 \W+,它在遇到非单词字符时拆分文本。

警惕病态正则表达式

模式分词器使用 Java 正则表达式

编写不良的正则表达式可能会运行非常缓慢,甚至抛出 StackOverflowError 并导致运行它的节点突然退出。

阅读有关 病态正则表达式以及如何避免它们 的更多信息。

示例输出编辑

response = client.indices.analyze(
  body: {
    tokenizer: 'pattern',
    text: "The foo_bar_size's default is 5."
  }
)
puts response
POST _analyze
{
  "tokenizer": "pattern",
  "text": "The foo_bar_size's default is 5."
}

上面的句子将生成以下词条

[ The, foo_bar_size, s, default, is, 5 ]

配置编辑

pattern 分词器接受以下参数

pattern

Java 正则表达式,默认为 \W+

flags

Java 正则表达式 标志。标志应以管道符分隔,例如 "CASE_INSENSITIVE|COMMENTS"

group

要提取为词条的捕获组。默认为 -1(拆分)。

示例配置编辑

在此示例中,我们将 pattern 分词器配置为在遇到逗号时将文本拆分为词条

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          my_analyzer: {
            tokenizer: 'my_tokenizer'
          }
        },
        tokenizer: {
          my_tokenizer: {
            type: 'pattern',
            pattern: ','
          }
        }
      }
    }
  }
)
puts response

response = client.indices.analyze(
  index: 'my-index-000001',
  body: {
    analyzer: 'my_analyzer',
    text: 'comma,separated,values'
  }
)
puts response
PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "pattern",
          "pattern": ","
        }
      }
    }
  }
}

POST my-index-000001/_analyze
{
  "analyzer": "my_analyzer",
  "text": "comma,separated,values"
}

上面的示例生成以下词条

[ comma, separated, values ]

在下一个示例中,我们将 pattern 分词器配置为捕获用双引号括起来的值(忽略嵌入的转义引号 \")。正则表达式本身如下所示

"((?:\\"|[^"]|\\")*)"

其解释如下

  • 文字 "
  • 开始捕获

    • 文字 \" 或除 " 之外的任何字符
    • 重复直到没有更多字符匹配
  • 文字闭合 "

在 JSON 中指定模式时,需要对 "\ 字符进行转义,因此模式最终如下所示

\"((?:\\\\\"|[^\"]|\\\\\")+)\"
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          my_analyzer: {
            tokenizer: 'my_tokenizer'
          }
        },
        tokenizer: {
          my_tokenizer: {
            type: 'pattern',
            pattern: '"((?:\\\"|[^"]|\\\")+)"',
            group: 1
          }
        }
      }
    }
  }
)
puts response

response = client.indices.analyze(
  index: 'my-index-000001',
  body: {
    analyzer: 'my_analyzer',
    text: '"value", "value with embedded \" quote"'
  }
)
puts response
PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "pattern",
          "pattern": "\"((?:\\\\\"|[^\"]|\\\\\")+)\"",
          "group": 1
        }
      }
    }
  }
}

POST my-index-000001/_analyze
{
  "analyzer": "my_analyzer",
  "text": "\"value\", \"value with embedded \\\" quote\""
}

上面的示例生成以下两个词条

[ value, value with embedded \" quote ]