Elasticsearch 2.2:利用edge-ngram和pattern filter提取指定标题内容
解决Elasticsearch 2.2中提取特定格式标题字段的问题
嘿,针对你在Elasticsearch 2.2里处理这类标题字段的需求,我来给你拆解下怎么调整分析器配置,拿到你想要的SimpleDoc000155和155这两个结果:
首先,先明确你的字段格式:前缀(长度/字符类型不固定)+数字串+/+单个数字,比如示例中的SimpleDoc000155/1。我们需要通过pattern_capture过滤器来精准捕获两个目标内容:斜杠前的完整前缀+数字串,以及数字串去掉前导零后的有效数字部分。
调整后的分析器配置
我帮你修改了原有的配置,用keyword分词器替代autocomplete(因为我们不需要拆分字段,而是要对整个字段做正则捕获),并更新了pattern_capture的规则:
"analysis": { "analyzer": { "my_analyzer": { "tokenizer": "keyword", "filter": [ "code_extraction", "lowercase" // 若不需要小写转换,可移除这一项 ] } }, "filter": { "code_extraction": { "type": "pattern_capture", "preserve_original": 0, // 设为1会保留原始字段值,按需调整 "patterns": [ "([^/]+)", // 捕获斜杠前的完整内容,即SimpleDoc000155 "(?:.*?)(0*(\\d+))(?=\\/)" // 捕获前缀后数字串去掉前导零的部分,即155 ] } } }
配置说明
- keyword分词器:确保整个标题字段作为单个token传入过滤器,避免不必要的拆分干扰正则匹配。
- pattern_capture过滤器:
- 第一个正则
([^/]+):匹配斜杠前的所有字符,直接捕获你需要的SimpleDoc000155。 - 第二个正则
(?:.*?)(0*(\\d+))(?=\\/):(?:.*?):非贪婪匹配前缀部分(不生成token),确保不会吃掉后面的数字。0*(\\d+):匹配前导零加有效数字,只捕获有效数字部分(比如000155会提取出155)。(?=\\/):正向预查,确保匹配的内容后面紧跟斜杠,避免误匹配其他数字。
- 第一个正则
- preserve_original:设为0时只会输出两个捕获结果;如果需要保留原始标题字段值,改为1即可。
测试效果
用这个分析器处理SimpleDoc000155/1,会得到两个token(如果保留lowercase的话):simpledoc000155和155,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Klemen
相关产品推荐
相关产品推荐

