当前位置: 首页 > ops >正文

【lucene】如何给StandardAnalyzer添加charfilter

结论先行:不能直接给 `StandardAnalyzer` 本身加 CharFilter,因为 `StandardAnalyzer` 是 final 类,其 `createComponents` 方法只返回固定的 `Tokenizer + TokenFilter` 链,且没有预留 CharFilter 的入口。

 

---

 

正确做法:自己写一个 自定义 Analyzer

 

```java

public final class MyAnalyzer extends Analyzer {

    private final CharFilterFactory[] charFilters;

    private final TokenFilterFactory[] tokenFilters;

 

    public MyAnalyzer(CharFilterFactory[] charFilters,

                      TokenFilterFactory[] tokenFilters) {

        this.charFilters = charFilters;

        this.tokenFilters = tokenFilters;

    }

 

    @Override

    protected Reader initReader(String fieldName, Reader reader) {

        // 把 CharFilter 一层层包裹 Reader

        for (CharFilterFactory f : charFilters) {

            reader = f.create(reader);

        }

        return reader;

    }

 

    @Override

    protected TokenStreamComponents createComponents(String fieldName) {

        // 标准分词器 + 你想要的 TokenFilter

        StandardTokenizer src = new StandardTokenizer();

        TokenStream tok = src;

        for (TokenFilterFactory f : tokenFilters) {

            tok = f.create(tok);

        }

        return new TokenStreamComponents(src, tok);

    }

}

```

 

---

 

使用示例

 

```java

CharFilterFactory html = new HTMLStripCharFilterFactory(Map.of());

TokenFilterFactory lower = new LowerCaseFilterFactory(Map.of());

Analyzer analyzer = new MyAnalyzer(new CharFilterFactory[]{html},

                                   new TokenFilterFactory[]{lower});

```

 

---

 

Elasticsearch 里怎么做?

在索引设置里直接写:

 

```json

"analyzer": {

  "my_std": {

    "tokenizer": "standard",

    "char_filter": ["html_strip"],

    "filter": ["lowercase"]

  }

}

```

 

ES 会在底层生成一个 与上面自定义 Analyzer 等价的实例。

 

---

 

一句话总结:  

 

> 想给 `StandardAnalyzer` 加 CharFilter,只能 继承 Analyzer 并自己实现 `initReader`;`StandardAnalyzer` 本身不可扩展。

http://www.xdnf.cn/news/16199.html

相关文章:

  • P1106 删数问题 - 洛谷
  • Multiscale Structure Guided Diffusion for Image Deblurring 论文阅读
  • 用友ERP 反射xss漏洞复现(CVE-2025-2709)
  • [NLP]多电源域设计的仿真验证方法
  • Linux运维新人自用笔记(Rsync远程传输备份,服务端、邮箱和客户端配置、脚本)
  • 编译器-gcc/g++和自动化构建-make/Makefile
  • AI冲击搜索?谷歌说:恰恰相反
  • C语言第 9 天学习笔记:数组(二维数组与字符数组)
  • 优秀案例:基于python django的智能家居销售数据采集和分析系统设计与实现,使用混合推荐算法和LSTM算法情感分析
  • Java 大视界 -- 基于 Java 的大数据分布式存储在工业互联网数据管理与边缘计算协同中的创新实践(364)
  • 矩阵谱分解的证明及计算示例
  • JVM相关面试八股
  • 虚拟机docker elasticsearch启动失败
  • Elasticsearch-ik分析器
  • 三维图像识别中OpenCV、PCL和Open3D结合的主要技术概念、部分示例
  • Java设计模式-代理模式
  • 《Angular+Spring Boot:ERP前端采购销售库存协同架构解析》
  • FalconFS: Distributed File System for Large-Scale Deep Learning Pipeline——论文阅读
  • ReVQ (Quantize-then-Rectify,量化后修正)
  • [MMU] Table walk flow详解
  • IAR编辑器如何让左侧的工具栏显示出来?
  • MCP工具开发实战:打造智能体的“超能力“
  • GaussDB 逻辑备份实操
  • windows11安装wsl装Ubuntu到D盘及可视化页面,安装docker及宝塔面板
  • 初识opencv03——图像预处理2
  • Day 20:奇异值SVD分解
  • Python Day15 面向对象核心特性笔记 及 例题分析
  • 数组toString方法及类型检测修复方案
  • Linux 内核基础统简全解:Kbuild、内存分配和地址映射
  • 【推荐100个unity插件】Animator 的替代品?—— Animancer Pro插件的使用介绍