在 Elasticsearch 中安装自定义分词器,通常需要 修改索引配置 或 开发插件。以下是详细方法:
适用于通过组合 Elasticsearch 内置的 Character Filters、Tokenizers 和 Token Filters 实现的分词器。
在创建索引时,通过 settings.analysis
配置自定义分词器:
PUT /my_custom_index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": { // 自定义分词器名称
"type": "custom", // 表示自定义类型
"char_filter": ["html_strip"], // 可选:预处理文本
"tokenizer": "ik_max_word", // 基础分词器(如IK中文分词)
"filter": [ // 词元过滤器链
"lowercase", // 英文转小写
"my_stopwords" // 自定义停用词过滤器
]
}
},
"filter": { // 自定义词元过滤器
"my_stopwords": {
"type": "stop",
"stopwords": ["的", "是", "和"] // 中文停用词
}
}
}
},
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "my_custom_analyzer" // 指定字段使用该分词器
}
}
}
}
GET /my_custom_index/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "这是一段HTML和Elasticsearch的测试文本
"
}
输出结果:
被移除。ik_max_word
切分。如果需要 全新的分词算法(如基于深度学习的模型),需开发插件并部署。
# 示例目录结构
elasticsearch-my-analyzer/
├── src/main/java/org/example/
│ ├── MyTokenizer.java # 实现 Tokenizer
│ ├── MyTokenizerFactory.java # 实现 Tokenizer 工厂
│ └── Plugin.java # 注册插件
├── config/ # 配置文件(如词典)
└── pom.xml # Maven 依赖
// MyTokenizer.java
public class MyTokenizer extends Tokenizer {
@Override
public boolean incrementToken() {
// 实现自定义分词逻辑
// 例如调用 Python 模型或规则引擎
}
}
// Plugin.java
public class MyAnalyzerPlugin extends Plugin implements AnalysisPlugin {
@Override
public Map<String, AnalysisProvider<TokenizerFactory>> getTokenizers() {
return singletonMap("my_tokenizer", MyTokenizerFactory::new);
}
}
mvn clean package
# 生成 target/releases/elasticsearch-my-analyzer-8.13.0.zip
# 将 ZIP 文件放到 plugins 目录
cd /usr/local/elasticsearch/plugins
mkdir my-analyzer
unzip elasticsearch-my-analyzer-8.13.0.zip -d my-analyzer/
chown -R elasticsearch:elasticsearch my-analyzer/
sudo systemctl restart elasticsearch
PUT /my_plugin_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "my_tokenizer" // 插件注册的分词器
}
}
}
}
}
适用于需要扩展已有分词器(如IK)的场景。
# 在 IK 插件目录下创建词典
echo "区块链\n深度学习" > /usr/local/elasticsearch/plugins/ik/config/custom.dic
编辑 plugins/ik/config/IKAnalyzer.cfg.xml
:
<entry key="ext_dict">custom.dicentry>
<entry key="remote_ext_dict">http://example.com/dict.txtentry>
sudo systemctl restart elasticsearch
GET /_cat/plugins?v # 查看已安装插件
GET /_analyze # 测试分词
问题 | 解决方案 |
---|---|
插件版本不匹配 | 确保插件版本与 ES 版本完全一致 |
权限不足 | chown -R elasticsearch:elasticsearch /path/to/plugin |
分词不生效 | 检查索引的 mapping.analyzer 配置 |
性能优化
pattern_replace
)。keyword
类型避免分词。热更新
_reload_search_analyzers
API 动态更新词典:POST /my_index/_reload_search_analyzers
监控
_nodes/stats/analysis
监控分词性能。通过上述方法,你可以灵活实现从简单规则到复杂算法的全部分词需求。