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

【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.dtcms.com/a/298268.html

相关文章:

  • HANA语法随手记:<> ‘NULL‘值问题
  • php算法-- 关联数组使用,优化sip账号去重
  • 验证 GitHub Pages 的自定义域(Windows)
  • 从混乱到秩序:IT服务管理如何重塑企业运营效率
  • CTF-Web题解:“require_once(‘flag.php‘); assert(“$i == $u“);”
  • C++ STL常用容器总结(vector, deque, list, map, set)
  • Schmidt 分解 ⚙️ 与 SVD 之间的本质联系
  • IDM:registered with a fake serial number
  • TDengine 转化函数 TO_UNIXTIMESTAMP 用户手册
  • 188.买卖股票的最佳时机IV 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费
  • Java 笔记 lambda
  • 多层感知机(深度学习-李沐-学习笔记)
  • 【WPS】office邮件合并,怎么将数据源excel中的下一条拼接在文档中的下一个位置
  • selenium 元素定位
  • 深入浅出设计模式——创建型模式之工厂模式
  • 机器学习(九):KNN算法全解析与项目实践
  • 记录es收集日志报错问题as the final mapping would have more than 1 type[XXX,doc]
  • HCIP MGRE实验
  • 【机器学习之推荐算法】基于矩阵分解和损失函数梯度下降的协同过滤算法实现
  • RAG实战指南 Day 24:上下文构建与提示工程
  • C 语言 | 结构体详解:自定义数据类型的艺术
  • 【第四章:大模型(LLM)】01.神经网络中的 NLP-(1)RNN、LSTM 和 GRU 的基本原理和应用
  • MySQL常用日期函数总结
  • [1-01-01]第42节:不可变字符序列 - String类中常用的API
  • 福彩双色球篮球号码的加减法
  • 探秘抖音商城:软件采集视角下的电商生态与数据价值
  • DeepSeek DeepEP学习(四)normal combine
  • zabbix----设置告警
  • Linux 系统时间设置(date 和 ntpdate)-linux028
  • Zookeeper学习专栏(十):核心流程剖析之服务启动、请求处理与选举协议