我正在尝试使用 chargroup 分词器构建基于空格和标点符号的分词器。我发现至少有5 个预定义字符组:whitespace, letter, digit, punctuation, symbol。
所以,我尝试了以下标记器:
\n\ntokenizer": {\n "my_tokenizer": { \n "type": "char_group", \n "tokenize_on_chars":["whitespace", "punctuation"]\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n然后,我意识到该@符号包含在punctuation我需要作为文本一部分的字符组中(例如捕获 Twitter 屏幕名称)。我不确定为什么@被认为是标点符号,但我的猜测是它可以在电子邮件地址中被视为标点符号?例如email@example.com。
无论如何,我自己添加了它们:
\n\ntokenizer": {\n "my_tokenizer": { \n "type": "char_group", \n "tokenize_on_chars":["whitespace", "\\n", ".", ",", ";", ":", "\\"", "`", "]", "[", ")", "(", "!", "?", "/", "\\\\", "\xe2\x80\x93"]\n }\n},\n\nRun Code Online (Sandbox Code Playgroud)\n\n然而,这个列表看起来相当随意,而且不太优雅。在哪里可以找到elasticsearch中不同字符组的定义?(或者,是否有一种更优雅的方法来根据standard英语和德语的标点符号列表来分隔标记?)。
你可以看一下这个的源代码:
该类java.lang.Character负责定义常量,例如:
Character.MODIFIER_SYMBOL : ` ^
Character.DASH_PUNCTUATION : -
Character.MATH_SYMBOL : = ~ + | < >
Character.OTHER_PUNCTUATION : !@#%&*;':",./?
Character.START_PUNCTUATION : ( [ {
Character.END_PUNCTUATION : ) ] }
Run Code Online (Sandbox Code Playgroud)