【lucene】如何评测一款分析器Analyzer
评测一款 Lucene Analyzer(分析器)通常要跑完 3 个维度、12 个指标、1 份可视化报告。下面给出可直接落地的“Checklist + 代码模板”,照着做就能拿到一份可复现的评测报告。
---
一、评测框架总览
1. 功能性:分词准确性、召回率、歧义处理、停用词、同义词、大小写、数字、标点。
2. 性能:吞吐量(MB/s)、延迟(ms/1000 docs)、内存峰值、GC 次数、索引膨胀率。
3. 可扩展性:自定义字典、热更新、线程安全、跨版本兼容。
---
二、12 项具体指标 & 工具
维度 指标 工具/脚本 阈值建议
分词准度 Precision / Recall / F1 IK 官方测试集 + `AnalyzerTestBase` F1 > 0.92
歧义消解 人工 Bad-case 抽样 200 条 Jupyter + Pandas Bad-case < 5 %
停用词 覆盖率 自建 3000 词停用表 覆盖率 > 98 %
吞吐量 docs/sec `JMH` 微基准 200 k docs/sec
延迟 P99 延迟 `JMH` + `HdrHistogram` < 5 ms
内存 峰值 RSS `java -Xlog:gc*` 增加 < 50 MB
索引膨胀 原始 vs 索引大小 `du -sh indexDir` 膨胀比 < 1.5
自定义字典 热更新耗时 `Dictionary#reload()` < 2 s
线程安全 并发分词 10 线程 `jcstress` 无 race
版本兼容 8.x/9.x/9.10 测试 Maven profile 0 error
可视化 Precision-Recall 曲线 `matplotlib` 图附报告
回归测试 CI nightly GitHub Actions 自动跑
---
三、一键可跑的代码模板(Java 17 + Maven)
1. 依赖
```xml
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>9.10.0</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.37</version>
</dependency>
```
2. JMH 微基准(吞吐量 / 延迟)
```java
@BenchmarkMode({Mode.Throughput, Mode.SampleTime})
@OutputTimeUnit(TimeUnit.SECONDS)
@State(Scope.Benchmark)
public class AnalyzerBench {
private Analyzer analyzer = new IKAnalyzer();
private String text = loadLargeText(); // 1 MB 中文
@Benchmark
public int tokenize() throws IOException {
int cnt = 0;
try (TokenStream ts = analyzer.tokenStream("f", text)) {
CharTermAttribute term = ts.addAttribute(CharTermAttribute.class);
ts.reset();
while (ts.incrementToken()) cnt++;
ts.end();
}
return cnt;
}
}
```
跑 `mvn package && java -jar target/benchmarks.jar -wi 3 -i 5 -f 1` 即可得吞吐量、延迟。
3. 分词准度脚本(Python)
```python
from sklearn.metrics import precision_recall_fscore_support
def eval_analyzer(analyzer, gold_lines, pred_lines):
y_true = [tok for line in gold_lines for tok in line.split()]
y_pred = [tok for line in pred_lines for tok in line.split()]
p, r, f1, _ = precision_recall_fscore_support(y_true, y_pred, average='micro')
return p, r, f1
```
---
四、完整实验流程(5 步)
1. 准备语料
- 新闻 10 万篇 + 人工标注 2 千句作为 gold 切分。
2. 运行 JMH 得性能基线。
3. 跑 `eval_analyzer` 得 P/R/F1,输出 PR 曲线。
4. 压测内存:`-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC` 观察无 GC 时内存峰值。
5. 生成 Markdown 报告 + 折线图,CI 每晚自动跑回归。
---
五、一句话总结
把“功能指标”当尺子、“性能指标”当秒表、“扩展指标”当保险丝,三步走完就能给出一份可复现、可回归、可横向对比的 Lucene 分析器评测报告。