分词分隔符标记过滤器

编辑

我们建议使用 word_delimiter_graph 代替 word_delimiter 过滤器。

word_delimiter 过滤器可能会生成无效的标记图。请参阅 word_delimiter_graph 和 word_delimiter 之间的区别

word_delimiter 过滤器也使用 Lucene 的 WordDelimiterFilter,该过滤器已被标记为已弃用。

在非字母数字字符处分割标记。 word_delimiter 过滤器还会根据一组规则执行可选的标记规范化。默认情况下,过滤器使用以下规则:

  • 在非字母数字字符处分割标记。过滤器使用这些字符作为分隔符。例如:Super-DuperSuper, Duper
  • 移除每个标记的前导或尾随分隔符。例如:XL---42+'Autocoder'XL, 42, Autocoder
  • 在字母大小写转换处分割标记。例如:PowerShotPower, Shot
  • 在字母数字转换处分割标记。例如:XL500XL, 500
  • 移除每个标记末尾的英语所有格 ('s)。例如:Neil'sNeil

word_delimiter 过滤器旨在从复杂的标识符(例如产品 ID 或零件编号)中删除标点符号。对于这些用例,我们建议将 word_delimiter 过滤器与 keyword 分词器一起使用。

避免使用 word_delimiter 过滤器来分割带连字符的单词,例如 wi-fi。因为用户经常搜索带连字符和不带连字符的这些单词,所以我们建议改用 synonym_graph 过滤器。

示例

编辑

以下 分析 API 请求使用 word_delimiter 过滤器根据过滤器的默认规则将 Neil's-Super-Duper-XL500--42+AutoCoder 分割成规范化的标记。

resp = client.indices.analyze(
    tokenizer="keyword",
    filter=[
        "word_delimiter"
    ],
    text="Neil's-Super-Duper-XL500--42+AutoCoder",
)
print(resp)
response = client.indices.analyze(
  body: {
    tokenizer: 'keyword',
    filter: [
      'word_delimiter'
    ],
    text: "Neil's-Super-Duper-XL500--42+AutoCoder"
  }
)
puts response
const response = await client.indices.analyze({
  tokenizer: "keyword",
  filter: ["word_delimiter"],
  text: "Neil's-Super-Duper-XL500--42+AutoCoder",
});
console.log(response);
GET /_analyze
{
  "tokenizer": "keyword",
  "filter": [ "word_delimiter" ],
  "text": "Neil's-Super-Duper-XL500--42+AutoCoder"
}

过滤器生成以下标记:

[ Neil, Super, Duper, XL, 500, 42, Auto, Coder ]

添加到分析器

编辑

以下 创建索引 API 请求使用 word_delimiter 过滤器来配置新的 自定义分析器

resp = client.indices.create(
    index="my-index-000001",
    settings={
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "keyword",
                    "filter": [
                        "word_delimiter"
                    ]
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          my_analyzer: {
            tokenizer: 'keyword',
            filter: [
              'word_delimiter'
            ]
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  settings: {
    analysis: {
      analyzer: {
        my_analyzer: {
          tokenizer: "keyword",
          filter: ["word_delimiter"],
        },
      },
    },
  },
});
console.log(response);
PUT /my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "filter": [ "word_delimiter" ]
        }
      }
    }
  }
}

避免将 word_delimiter 过滤器与移除标点符号的分词器一起使用,例如 standard 分词器。这可能会阻止 word_delimiter 过滤器正确分割标记。它还会干扰过滤器的可配置参数,例如 catenate_allpreserve_original。我们建议改用 keywordwhitespace 分词器。

可配置参数

编辑
catenate_all

(可选,布尔值) 如果为 true,则过滤器将为由非字母分隔符分隔的字母数字字符链生成连接的标记。例如:super-duper-xl-500 → [ super, superduperxl500, duper, xl, 500 ]。默认为 false

在用于搜索分析时,连接的标记可能会导致 match_phrase 查询和其他依赖于标记位置进行匹配的查询出现问题。如果您计划使用这些查询,请避免将此参数设置为 true

catenate_numbers

(可选,布尔值) 如果为 true,则过滤器将为由非字母分隔符分隔的数字字符链生成连接的标记。例如:01-02-03 → [ 01, 010203, 02, 03 ]。默认为 false

在用于搜索分析时,连接的标记可能会导致 match_phrase 查询和其他依赖于标记位置进行匹配的查询出现问题。如果您计划使用这些查询,请避免将此参数设置为 true

catenate_words

(可选,布尔值) 如果为 true,则过滤器将为由非字母分隔符分隔的字母字符链生成连接的标记。例如:super-duper-xl → [ super, superduperxl, duper, xl ]。默认为 false

在用于搜索分析时,连接的标记可能会导致 match_phrase 查询和其他依赖于标记位置进行匹配的查询出现问题。如果您计划使用这些查询,请避免将此参数设置为 true

generate_number_parts
(可选,布尔值) 如果为 true,则过滤器将在输出中包含仅包含数字字符的标记。如果为 false,则过滤器将从输出中排除这些标记。默认为 true
generate_word_parts
(可选,布尔值) 如果为 true,则过滤器将在输出中包含仅包含字母字符的标记。如果为 false,则过滤器将从输出中排除这些标记。默认为 true
preserve_original
(可选,布尔值) 如果为 true,则过滤器将在输出中包含任何分割标记的原始版本。此原始版本包括非字母数字分隔符。例如:super-duper-xl-500 → [ super-duper-xl-500, super, duper, xl, 500 ]。默认为 false
protected_words
(可选,字符串数组) 过滤器不会分割的标记数组。
protected_words_path

(可选,字符串) 包含过滤器不会分割的标记列表的文件路径。

此路径必须是相对于 config 位置的绝对路径或相对路径,并且文件必须是 UTF-8 编码的。文件中每个标记必须用换行符分隔。

split_on_case_change
(可选,布尔值) 如果为 true,则过滤器将在字母大小写转换处分割标记。例如:camelCase → [ camel, Case ]。默认为 true
split_on_numerics
(可选,布尔值) 如果为 true,则过滤器将在字母数字转换处分割标记。例如:j2se → [ j, 2, se ]。默认为 true
stem_english_possessive
(可选,布尔值) 如果为 true,则过滤器将移除每个标记末尾的英语所有格 ('s)。例如:O'Neil's → [ O, Neil ]。默认为 true
type_table

(可选,字符串数组) 字符的自定义类型映射数组。这允许您将非字母数字字符映射为数字或字母数字,以避免在这些字符处分割。

例如,以下数组将加号 (+) 和减号 (-) 字符映射为字母数字,这意味着它们不会被视为分隔符:

[ "+ => ALPHA", "- => ALPHA" ]

支持的类型包括:

  • ALPHA (字母)
  • ALPHANUM (字母数字)
  • DIGIT (数字)
  • LOWER (小写字母)
  • SUBWORD_DELIM (非字母数字分隔符)
  • UPPER (大写字母)
type_table_path

(可选,字符串) 包含字符自定义类型映射的文件路径。这允许您将非字母数字字符映射为数字或字母数字,以避免在这些字符处分割。

例如,此文件的内容可能包含以下内容:

# Map the $, %, '.', and ',' characters to DIGIT
# This might be useful for financial data.
$ => DIGIT
% => DIGIT
. => DIGIT
\\u002C => DIGIT

# in some cases you might not want to split on ZWJ
# this also tests the case where we need a bigger byte[]
# see https://en.wikipedia.org/wiki/Zero-width_joiner
\\u200D => ALPHANUM

支持的类型包括:

  • ALPHA (字母)
  • ALPHANUM (字母数字)
  • DIGIT (数字)
  • LOWER (小写字母)
  • SUBWORD_DELIM (非字母数字分隔符)
  • UPPER (大写字母)

此文件路径必须是相对于 config 位置的绝对路径或相对路径,并且文件必须是 UTF-8 编码的。文件中每个映射必须用换行符分隔。

自定义

编辑

要自定义 word_delimiter 过滤器,请复制它以创建新自定义标记过滤器的基础。您可以使用其可配置参数修改过滤器。

例如,以下请求创建一个 word_delimiter 过滤器,该过滤器使用以下规则:

  • 在非字母数字字符处分割标记,*除了* 连字符 (-) 字符。
  • 移除每个标记的前导或尾随分隔符。
  • 不要在字母大小写转换处分割标记。
  • 不要在字母数字转换处分割标记。
  • 移除每个标记末尾的英语所有格 ('s)。
resp = client.indices.create(
    index="my-index-000001",
    settings={
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "keyword",
                    "filter": [
                        "my_custom_word_delimiter_filter"
                    ]
                }
            },
            "filter": {
                "my_custom_word_delimiter_filter": {
                    "type": "word_delimiter",
                    "type_table": [
                        "- => ALPHA"
                    ],
                    "split_on_case_change": False,
                    "split_on_numerics": False,
                    "stem_english_possessive": True
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          my_analyzer: {
            tokenizer: 'keyword',
            filter: [
              'my_custom_word_delimiter_filter'
            ]
          }
        },
        filter: {
          my_custom_word_delimiter_filter: {
            type: 'word_delimiter',
            type_table: [
              '- => ALPHA'
            ],
            split_on_case_change: false,
            split_on_numerics: false,
            stem_english_possessive: true
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  settings: {
    analysis: {
      analyzer: {
        my_analyzer: {
          tokenizer: "keyword",
          filter: ["my_custom_word_delimiter_filter"],
        },
      },
      filter: {
        my_custom_word_delimiter_filter: {
          type: "word_delimiter",
          type_table: ["- => ALPHA"],
          split_on_case_change: false,
          split_on_numerics: false,
          stem_english_possessive: true,
        },
      },
    },
  },
});
console.log(response);
PUT /my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "filter": [ "my_custom_word_delimiter_filter" ]
        }
      },
      "filter": {
        "my_custom_word_delimiter_filter": {
          "type": "word_delimiter",
          "type_table": [ "- => ALPHA" ],
          "split_on_case_change": false,
          "split_on_numerics": false,
          "stem_english_possessive": true
        }
      }
    }
  }
}