Elasticsearch 8.3.3:如何创建可生成所有可能分词的分析器?
Elasticsearch 自定义分析器解决方案
针对你需要生成指定分词的需求,以下是适用于Elasticsearch 8.3.3的自定义分析器实现:
1. 创建索引与自定义分析器
PUT /filename_index { "settings": { "analysis": { "char_filter": { "filename_ext_split": { "type": "pattern_replace", "pattern": "([a-zA-Z]+)\\.[^\\s]+", "replacement": "$1 $0" } }, "analyzer": { "comprehensive_filename_analyzer": { "char_filter": ["filename_ext_split"], "tokenizer": "whitespace", "filter": [ "hyphen_part_capture", "unique", "filename_shingles" ] } }, "filter": { "hyphen_part_capture": { "type": "pattern_capture", "preserve_original": true, "patterns": [ "^([A-Za-z]+)", "^([A-Za-z]+-\\d+)", "(-\\d+-\\d+$)", "(\\d+-\\d+$)", "(-\\d+$)", "(\\d+$)" ] }, "filename_shingles": { "type": "shingle", "min_shingle_size": 2, "max_shingle_size": 2, "output_unigrams": true } } } }, "mappings": { "properties": { "filename": { "type": "text", "analyzer": "comprehensive_filename_analyzer" } } } }
2. 分析器组件说明
- char_filter: filename_ext_split:将带扩展名的文件名(如
xyz.pdf)转换为xyz xyz.pdf,确保后续能生成xyz和xyz.pdf两个基础分词。 - tokenizer: whitespace:按空格分割文本,得到初始分词列表(如
AB-12-1993、xyz、xyz.pdf)。 - filter: hyphen_part_capture:通过正则捕获从连字符分割的字符串中提取所需子串,包括:
- 前缀字母部分(如
AB) - 字母加前一段数字(如
AB-12) - 带前缀连字符的后两段数字(如
-12-1993) - 后两段数字(如
12-1993) - 带前缀连字符的最后一段数字(如
-1993) - 最后一段数字(如
1993) - 保留原始分词(如
AB-12-1993)
- 前缀字母部分(如
- filter: unique:移除重复生成的分词(如重复的
xyz)。 - filter: filename_shingles:生成相邻分词的组合,如
AB-12-1993 xyz和AB-12-1993 xyz.pdf,同时保留所有单个分词。
3. 测试分析器
执行以下请求验证分词结果:
POST /filename_index/_analyze { "analyzer": "comprehensive_filename_analyzer", "text": "AB-12-1993 xyz.pdf" }
生成的核心分词(含所有要求的分词):
ABAB-12-12-199312-1993-19931993xyzxyz.pdfAB-12-1993 xyzAB-12-1993 xyz.pdf
额外生成的分词(如AB-12-1993、AB AB-12等)均为可接受的冗余分词。
内容的提问来源于stack exchange,提问作者Shivam Raj
相关产品推荐
相关产品推荐

