词元过滤器
本文禁止转载
word_delimiter_graph
使用非字母字符切分 tokens,并可以根据规则执行一些可选的 token
正则化。默认情况下, word_delimiter_graph
会使用以下规则:
- 使用非字母字符作为切分点。 比如
Super-Duper
→Super
,Duper
- 移除每个
token
前置和后置分隔符。比如XL---42+'Autocoder'
→XL
,42
,Autocoder
- 在单词大小写过度位置做切分。 比如
PowerShot
→Power
,Shot
- 在单词字母和数字过度位置切分。 比如
XL500
→XL
,500
- 移除
token
后的('s
)。 例如Neil's
→Neil
word_delimiter_graph
过滤器的实现使用的是 Lucene 的 WordDelimiterGraphFilter。
Tips:
word_delimiter_graph
过滤器设计目标是为了处理 产品 ID 号,零部件号,这样的场景。此场景下推荐搭配keyword
tokenzier 使用避免使用
word_delimiter_graph
过滤器本身带有连接符的单词,比如wi-fi
,因为用户无论是wifi
还是wi-fi
都比较常用,这种场景建议使用synonym_graph
。
示例
GET /_analyze
{
"tokenizer": "keyword",
"filter": [ "word_delimiter_graph" ],
"text": "Neil's-Super-Duper-XL500--42+AutoCoder"
}
结果:
[ Neil, Super, Duper, XL, 500, 42, Auto, Coder ]
添加到 Analyzer
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"filter": [ "word_delimiter_graph" ]
}
}
}
}
}
WARNING: 避免和会去除标点符号的 tokenizers 搭配使用
word_delimiter_graph
,比如standard
tokenizer。这样可能会导致word_delimiter_graph
切分不正确,也可能会影响此过滤器一些可配置参数的工作,如catenate_all
orpreserve_original
。所以推荐使用keyword
orwhitespace
tokenizer。
可配置参数
adjust_offsets
:
可选,默认为 true
, 为 true
会自动调整切分后的 term 在 doc 中的 offset 信息
WARNING: 如果我们使用
trim
过滤器,要设置adjust_offsets
为false
,因为trim
过滤器会改变 token 的长度而不会改变其 offsets,这时候如果adjust_offsets
为true
,就可能导致切分的 token 的 offset 不正确。
catenate_all
: 默认为 false
。如果为 true
,会使用非字母分隔符将所有的数字字母连接在一起,比如: super-duper-xl-500
→ [ superduperxl500
, super
, duper
, xl
, 500
]. Defaults to false
.
WARNING: 默认为
false
,设置为true
, 会产生 multi-position 的 tokens。这是建立索引过程所不支持的。如果参数设置为
true
, 不要作为建立索引时的 analyzer,或者在此过滤器后使用flatten_graph
过滤器,确保建立索引阶段正常工作。当被用于 search 阶段的 analysis 时,会对
match_phrase
以及其它一些依赖 token position 信息进行 match 的 query 造成问题,如果真计划使用这些 query,记的设置为true
。
catenate_numbers
和 catenate_all
区别是,只对使用非字母分隔符分隔的数字进行连接。 比如 01-02-03
→ [ 010203
, 01
, 02
, 03
]。
WARNING: 和
catenate_all
一样
catenate_words
和 catenate_all
区别是,只对使用非字母分隔符分隔的字母进行连接。 比如 super-duper-xl
→ [ superduperxl
, super
, duper
, xl
]。
WARNING: 和
catenate_all
一样
generate_number_parts
true
导致生成数字子词:“500-42” ⇒ “500” “42”。默认 true
generate_word_parts
*true *导致单词最大程度的链接到一起:“wi-fi” ⇒ “wifi”。默认 false
preserve_original
true
在子词中保留原始词: super-duper-xl-500
→ [ super-duper-xl-500
, super
, duper
, xl
, 500
]。默认 false
protected_words
被分隔时的受保护词列表。 一个数组
protected_words_path
设置为配置有保护字的文件(每行一个)。 如果存在,则自动解析为基于 config/ 位置的位置。
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
例如,自定义类型映射表(使用 type_table_path
配置时),通过自定义,将非字母数字字符分隔符映射成其它字符,即映射后,这些字符便不会被作为分隔符而被保留下来。比如 [ "+ => ALPHA", "- => ALPHA" ]
Supported types include:
ALPHA
(Alphabetical)ALPHANUM
(Alphanumeric)DIGIT
(Numeric)LOWER
(Lowercase alphabetical)SUBWORD_DELIM
(Non-alphanumeric delimiter)UPPER
(Uppercase alphabetical)
type_table_path
用户映射文件路径, 配合** type_table
**使用。 文件示例:
# 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 http://en.wikipedia.org/wiki/Zero-width_joiner
\\u200D => ALPHANUM
定制化示例
下面官方给了一个定制 filter 的示例,并定制了以下规则:
- Split tokens at non-alphanumeric characters, except the hyphen (
-
) character. - Remove leading or trailing delimiters from each token.
- Do not split tokens at letter case transitions.
- Do not split tokens at letter-number transitions.
- Remove the English possessive (
's
) from the end of each token.
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"filter": [ "my_custom_word_delimiter_graph_filter" ]
}
},
"filter": {
"my_custom_word_delimiter_graph_filter": {
"type": "word_delimiter_graph",
"type_table": [ "- => ALPHA" ],
"split_on_case_change": false,
"split_on_numerics": false,
"stem_english_possessive": true
}
}
}
}
}
关于 [word_delimiter_graph
和 word_delimiter
的区别](https://zshipu.com/t?url=https%3A%2F%2Fwww.elastic.co%2Fguide%2Fen%2Felasticsearch%2Freference%2Fcu
- 原文作者:知识铺
- 原文链接:https://geek.zshipu.com/post/%E4%BA%92%E8%81%94%E7%BD%91/%E8%AF%8D%E5%85%83%E8%BF%87%E6%BB%A4%E5%99%A8/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com