单词分隔符词元过滤器

单词分隔符词元过滤器 #

单词分隔符(word_delimiter)词元过滤器用于根据预定义的字符拆分词元,还能根据可定制规则对词元进行可选的规范化处理。

我们建议尽可能使用 word_delimiter_graph 过滤器而非 word_delimiter 过滤器,因为 word_delimiter 过滤器有时会生成无效的词元图。

word_delimiter 过滤器可用于从零件编号或产品 ID 等复杂标识符中去除标点符号。在这种情况下,它最好与关键字分词器配合使用。对于带连字符的单词,建议使用同义词图(synonym_graph)词元过滤器而非 word_delimiter 过滤器,因为用户搜索这些词项时,常常既会搜索带连字符的形式,也会搜索不带连字符的形式。

默认情况下,该过滤器应用以下规则:

描述输入输出
将非字母数字字符视为分隔符ultra-fastultra, fast
去除词元开头或结尾的分隔符Z99++'Decoder'Z99, Decoder
当字母大小写发生转换时拆分词元EasysearchEasy, search
当字母和数字之间发生转换时拆分词元T1000T, 1000
去除词元末尾的所有格形式(‘s)John'sJohn

重要提示:不要将该过滤器与会去除标点符号的分词器(如标准分词器)一起使用。这样做可能会导致词元无法正确拆分,并影响诸如 catenate_allpreserve_original 等选项的效果。我们建议将此过滤器与关键(keyword)字分词器或空白(whitespace)分词器配合使用。

参数说明 #

你可以使用以下参数配置单词分隔符词元过滤器。

参数必需/可选数据类型描述
catenate_all可选布尔值从一系列字母数字部分生成连接后的词元。例如,quick-fast-200 会变成 [ quickfast200, quick, fast, 200 ]。默认值为 false
catenate_numbers可选布尔值连接数字序列。例如,10-20-30 会变成 [ 102030, 10, 20, 30 ]。默认值为 false
catenate_words可选布尔值连接字母单词。例如,high-speed-level 会变成 [ highspeedlevel, high, speed, level ]。默认值为 false
generate_number_parts可选布尔值如果为 true,输出中会包含纯数字词元(仅由数字组成的词元)。默认值为 true
generate_word_parts可选布尔值如果为 true,输出中会包含纯字母词元(仅由字母字符组成的词元)。默认值为 true
preserve_original可选布尔值在输出中,除了生成的词元外,还保留原始词元(可能包含非字母数字分隔符)。例如,auto-drive-300 会变成 [ auto - drive - 300, auto, drive, 300 ]。如果为 true,该过滤器会生成索引不支持的多位置词元,因此请勿在索引分词器中使用此过滤器,或者在该过滤器之后使用 flatten_graph 过滤器。默认值为 false
protected_words可选字符串数组指定不应被拆分的词元。
protected_words_path可选字符串指定一个文件的路径(绝对路径或相对于配置目录的相对路径),该文件包含不应被分隔的词元,词元需分行列出。
split_on_case_change可选布尔值在连续字母大小写不同(一个为小写,另一个为大写)的位置拆分词元。例如,Easysearch 会变成 [ Easy, search ]。默认值为 true
split_on_numerics可选布尔值在连续字母和数字的位置拆分词元。例如,v8engine 会变成 [ v, 8, engine ]。默认值为 true
stem_english_possessive可选布尔值去除英语所有格结尾,如 ‘s。默认值为 true
type_table可选字符串数组一个自定义映射,用于指定如何处理字符以及是否将其视为分隔符,以避免不必要的拆分。例如,要将连字符(-)视为字母数字字符,可指定 ["- => ALPHA"],这样单词就不会在连字符处拆分。有效类型有:
- ALPHA:字母
- ALPHANUM:字母数字
- DIGIT:数字
- LOWER:小写字母
- SUBWORD_DELIM:非字母数字分隔符
- UPPER:大写字母
type_table_path可选字符串指定一个文件的路径(绝对路径或相对于配置目录的相对路径),该文件包含自定义字符映射。该映射指定如何处理字符以及是否将其视为分隔符,以避免不必要的拆分。有关有效类型,请参阅 type_table

参考样例 #

以下示例请求创建了一个名为 my-custom-index 的新索引,并配置了一个带有单词分隔符过滤器(word_delimiter)的分词器。

PUT /my-custom-index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "custom_analyzer": {
          "tokenizer": "keyword",
          "filter": [ "custom_word_delimiter_filter" ]
        }
      },
      "filter": {
        "custom_word_delimiter_filter": {
          "type": "word_delimiter",
          "split_on_case_change": true,
          "split_on_numerics": true,
          "stem_english_possessive": true
        }
      }
    }
  }
}

产生的词元 #

使用以下请求来检查使用该分词器生成的词元:

GET /my-custom-index/_analyze
{
  "analyzer": "custom_analyzer",
  "text": "FastCar's Model2023"
}

返回内容包含产生的词元

{
  "tokens": [
    {
      "token": "Fast",
      "start_offset": 0,
      "end_offset": 4,
      "type": "word",
      "position": 0
    },
    {
      "token": "Car",
      "start_offset": 4,
      "end_offset": 7,
      "type": "word",
      "position": 1
    },
    {
      "token": "Model",
      "start_offset": 10,
      "end_offset": 15,
      "type": "word",
      "position": 2
    },
    {
      "token": "2023",
      "start_offset": 15,
      "end_offset": 19,
      "type": "word",
      "position": 3
    }
  ]
}