词语分隔符图词元过滤器
word_delimiter_graph
词元过滤器用于根据预定义字符拆分词元,并提供基于可自定义规则的可选词元规范化。
word_delimiter_graph
过滤器用于从部件号或产品 ID 等复杂标识符中移除标点符号。在这种情况下,最好与 keyword
分词器一起使用。对于连字符词,请使用 synonym_graph
词元过滤器而不是 word_delimiter_graph
过滤器,因为用户经常使用带连字符和不带连字符的两种方式搜索这些词。
默认情况下,该过滤器应用以下规则。
描述 | 输入 | 输出 |
---|---|---|
将非字母数字字符视作分隔符。 | ultra-fast | ultra , fast |
移除词元开头或结尾的分隔符。 | Z99++'Decoder' | Z99 , Decoder |
当大小写字母之间存在转换时拆分词元。 | OpenSearch | Open , Search |
当字母和数字之间存在转换时拆分词元。 | T1000 | T , 1000 |
从词元末尾移除所有格('s)。 | John's | John |
重要的是,不要将剥离标点符号的分词器(例如 standard
分词器)与此过滤器一起使用。这样做可能会阻止正确的词元拆分,并干扰 catenate_all
或 preserve_original
等选项。我们建议将此过滤器与 keyword
或 whitespace
分词器一起使用。
参数
您可以使用以下参数配置 word_delimiter_graph
词元过滤器。
参数 | 必需/可选 | 数据类型 | 描述 |
---|---|---|---|
adjust_offsets | 可选 | 布尔型 | 确定是否应为拆分或连接的词元重新计算词元偏移量。当设置为 true 时,过滤器会调整词元偏移量,以准确表示词元在词元流中的位置。这种调整可确保文本中词元的位置与其处理后的修改形式对齐,这对于高亮显示或短语查询等应用程序特别有用。当设置为 false 时,偏移量保持不变,这可能会导致处理后的词元映射回原始文本中的位置时出现错位。如果您的分析器使用像 trim 这样在不改变偏移量的情况下改变词元长度的过滤器,我们建议将此参数设置为 false 。默认为 true 。 |
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 。 |
ignore_keywords | 可选 | 布尔型 | 是否处理标记为关键字的词元。默认为 false 。 |
preserve_original | 可选 | 布尔型 | 在输出中保留原始词元(可能包含非字母数字分隔符)以及生成的词元。例如,"auto-drive-300" 变为 [ auto-drive-300, auto, drive, 300 ] 。如果为 true ,则该过滤器会生成索引不支持的多位置词元,因此不要在索引分析器中使用此过滤器,或者在此过滤器之后使用 flatten_graph 过滤器。默认为 false 。 |
protected_words | 可选 | 字符串数组 | 指定不应拆分的词元。 |
protected_words_path | 可选 | 字符串 | 指定一个路径(绝对路径或相对于配置目录的相对路径),指向包含不应按换行符分隔的词元的文件。 |
split_on_case_change | 可选 | 布尔型 | 当连续字母的大小写不同时(一个大写,一个非大写)拆分词元。例如,"OpenSearch" 变为 [ Open, 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_graph
过滤器的分析器
PUT /my-custom-index
{
"settings": {
"analysis": {
"analyzer": {
"custom_analyzer": {
"tokenizer": "keyword",
"filter": [ "custom_word_delimiter_filter" ]
}
},
"filter": {
"custom_word_delimiter_filter": {
"type": "word_delimiter_graph",
"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
}
]
}
word_delimiter_graph
和 word_delimiter
过滤器之间的区别
当以下任何参数设置为 true
时,word_delimiter_graph
和 word_delimiter
词元过滤器都会生成跨越多个位置的词元
catenate_all
catenate_numbers
catenate_words
preserve_original
为了说明这些过滤器之间的差异,请考虑输入文本 Pro-XT500
。
word_delimiter_graph
word_delimiter_graph
过滤器为多位置词元分配一个 positionLength
属性,指示词元跨越多少个位置。这确保了过滤器始终生成有效的词元图,使其适用于高级词元图场景。尽管索引不支持包含多位置词元的词元图,但它们在搜索场景中仍然很有用。例如,match_phrase
等查询可以使用这些图从单个输入字符串生成多个子查询。对于示例输入文本,word_delimiter_graph
过滤器生成以下词元
Pro
(位置 1)XT500
(位置 2)ProXT500
(位置 1,positionLength
: 2)
positionLength
属性允许生成用于高级查询的有效图。
word_delimiter
相反,word_delimiter
过滤器不为多位置词元分配 positionLength
属性,导致当这些词元存在时生成无效的图。对于示例输入文本,word_delimiter
过滤器生成以下词元
Pro
(位置 1)XT500
(位置 2)ProXT500
(位置 1, 无positionLength
)
缺少 positionLength
属性会导致词元流中包含多位置词元时,词元图无效。