Elasticsearch analysis 五大组件完整详解 + 实例

📅 2026/7/1 2:25:44
Elasticsearch analysis 五大组件完整详解 + 实例
前言analysis 是 ES 文本分析模块一段原始文本处理流水线完整顺序原始文本 → char_filter 字符预处理 → tokenizer 切词分词 → token_filter 词条加工衍生两类成品analyzer组装上面三套给 text 全文检索用会分词normalizer只有 char_filter token_filter无分词器给 keyword 精确匹配用不分词五大组件char_filter 字符过滤器tokenizer 分词器内核token_filter 词条过滤器简写 filteranalyzer 自定义分词器normalizer 标准化器一、char_filter 字符过滤器作用分词之前对原始整段文本做字符替换、删除、清洗修改原始字符流还没切词。常用 typemapping、html_strip、pattern_replace示例配置char_filter:{//1. mapping固定字符映射替换symbol_map:{type:mapping,mappings:[- _, and,# num]}, //2. html_strip去除HTML标签clear_html:{type:html_strip}, //3. pattern_replace正则批量替换del_all_digit:{type:pattern_replace,pattern:\\d,replacement:}}效果演示输入文本 h1HelloJava-2026#test /h1clear_html 处理HelloJava-2026#testsymbol_map 处理HelloandJava_2026numtestdel_all_digit 处理HelloandJava_numtest二、tokenizer 分词内核作用经过 char_filter 处理后的完整字符串切割成多个独立词条 (token)是分词核心必须有。常用 typestandard、whitespace、pattern、ik_max_word (中文)示例配置tokenizer:{// 空格切分split_by_space:{type:whitespace}, // 自定义正则分隔符逗号分割split_by_comma:{type:pattern,pattern:,}, // ES默认标准分词英文按单词、标点分割std_token:{type:standard}}效果演示文本Java,Go Python ESsplit_by_comma 分词结果[“Java”,“Go Python ES”]split_by_space 分词结果[“Java,Go”,“Python”,“ES”]standard 分词结果[“Java”,“Go”,“Python”,“ES”]三、filtertoken_filter词条过滤器作用分词完成后对每一个单独词条依次加工顺序由数组定义。常用 typelowercase、trim、stop、unique、asciifolding示例配置filter:{// 全部转小写to_lower:{type:lowercase}, // 清除词条首尾空格trim_space:{type:trim}, // 自定义停用词过滤无意义词汇remove_stop_word:{type:stop,stop_words:[a,the,is,and]}, // 词条去重unique_token:{type:unique}}完整流程演示分词后原始词条[ Hello,“AND”,“Hello”,“JAVA “]to_lower[” hello”,“and”,“hello”,java ]trim_space[“hello”,“and”,“hello”,“java”]remove_stop_word[“hello”,“hello”,“java”]unique_token[“hello”,“java”]四、analyzer 自定义分词器text 字段专用结构公式analyzer [char_filter可选] tokenizer必填 [filter可选]作用组装前面三类组件生成一套完整分词规则用于 text 类型字段支持模糊、全文检索。analyzer:{my_text_analyzer:{char_filter:[clear_html,symbol_map],tokenizer:std_token,filter:[to_lower,remove_stop_word,unique_token]}}完整流水线演示输入原文HelloJava AND Hello Python-2026char_filter去除 html、替换符号 → HelloandJava AND Hello Python_2026tokenizer 标准分词[“HelloandJava”,“AND”,“Hello”,“Python_2026”]filter 流水线小写 → 过滤 and 停用词 → 去重最终词条[“helloandjava”, “hello”, “python_2026”]使用位置mapping 中 text 字段引用title:{type:text,analyzer:my_text_analyzer}五、normalizer 标准化器keyword 字段专用结构公式normalizer [char_filter可选] [filter可选]无 tokenizer永远不分词整条文本只生成 1 个词条作用只清洗、不拆分用于 keyword 精确匹配、聚合、排序解决大小写、多余空格问题。type 仅支持 custom /built_in示例配置normalizer:{lower_trim_norm:{type:custom,char_filter:[symbol_map],filter:[lowercase,trim]}}效果演示输入 ABC-TEST处理后abc_test查询时 ABC-TEST / abc-test 均可精确匹配命中。使用位置mapping 中 keyword 字段引用code:{type:keyword,normalizer:lower_trim_norm}完整可直接执行的索引 Demo整合全部五大组件PUT /test_demo{settings:{analysis:{//1. char_filter 字符预处理char_filter:{symbol_map:{type:mapping,mappings:[- _, and]},clear_html:{type:html_strip}}, //2. tokenizer 分词内核tokenizer:{std_token:{type:standard}}, //3. token_filter 词条过滤器filter:{to_lower:{type:lowercase},trim_space:{type:trim},remove_stop_word:{type:stop,stop_words:[a,and,the]},unique_token:{type:unique}}, //4. analyzer 完整分词器text用analyzer:{my_text_analyzer:{char_filter:[clear_html,symbol_map],tokenizer:std_token,filter:[to_lower,remove_stop_word,unique_token]}}, //5. normalizer 标准化器keyword用normalizer:{lower_trim_norm:{type:custom,char_filter:[symbol_map],filter:[lowercase,trim_space]}}}},mappings:{properties:{article:{type:text,analyzer:my_text_analyzer},sku_code:{type:keyword,normalizer:lower_trim_norm}}}}