【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` 本身不可扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值