安装自定义分词器的完整步骤
在 Elasticsearch 中安装自定义分词器,通常需要 修改索引配置 或 开发插件。以下是详细方法:
一、基于配置实现自定义分词器(无需插件)
适用于通过组合 Elasticsearch 内置的 Character Filters、Tokenizers 和 Token Filters 实现的分词器。
1. 定义分词规则
在创建索引时,通过 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" // 指定字段使用该分词器
}
}
}
}
2. 测试分词效果
GET /my_custom_index/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "<p>这是一段HTML和Elasticsearch的测试文本</p>"
}
输出结果:
- HTML 标签
<p>被移除。 - “的” 被过滤。
- 英文 “Elasticsearch” 转为小写。
- 中文按
ik_max_word切分。
二、通过插件安装完全自定义分词器
如果需要 全新的分词算法(如基于深度学习的模型),需开发插件并部署。
1. 开发分词器插件
(1) 创建插件项目结构
# 示例目录结构
elasticsearch-my-analyzer/
├── src/main/java/org/example/
│ ├── MyTokenizer.java # 实现 Tokenizer
│ ├── MyTokenizerFactory.java # 实现 Tokenizer 工厂
│ └── Plugin.java # 注册插件
├── config/ # 配置文件(如词典)
└── pom.xml # Maven 依赖
(2) 核心代码示例
// 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);
}
}
2. 编译并部署插件
(1) 打包插件
mvn clean package
# 生成 target/releases/elasticsearch-my-analyzer-8.13.0.zip
(2) 安装到 Elasticsearch
# 将 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/
(3) 重启 Elasticsearch
sudo systemctl restart elasticsearch
3. 使用插件中的分词器
PUT /my_plugin_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "my_tokenizer" // 插件注册的分词器
}
}
}
}
}
三、混合方案:自定义词典+内置分词器
适用于需要扩展已有分词器(如IK)的场景。
1. 配置 IK 自定义词典
(1) 添加词典文件
# 在 IK 插件目录下创建词典
echo "区块链\n深度学习" > /usr/local/elasticsearch/plugins/ik/config/custom.dic
(2) 修改 IK 配置
编辑 plugins/ik/config/IKAnalyzer.cfg.xml:
<entry key="ext_dict">custom.dic</entry>
<entry key="remote_ext_dict">http://example.com/dict.txt</entry> <!-- 支持热更新 -->
(3) 重启生效
sudo systemctl restart elasticsearch
四、验证与调试
1. 检查分词器列表
GET /_cat/plugins?v # 查看已安装插件
GET /_analyze # 测试分词
2. 常见问题解决
| 问题 | 解决方案 |
|---|---|
| 插件版本不匹配 | 确保插件版本与 ES 版本完全一致 |
| 权限不足 | chown -R elasticsearch:elasticsearch /path/to/plugin |
| 分词不生效 | 检查索引的 mapping.analyzer 配置 |
五、生产环境建议
-
性能优化
- 避免复杂正则表达式(如
pattern_replace)。 - 对高频词使用
keyword类型避免分词。
- 避免复杂正则表达式(如
-
热更新
- 通过
_reload_search_analyzersAPI 动态更新词典:POST /my_index/_reload_search_analyzers
- 通过
-
监控
- 使用
_nodes/stats/analysis监控分词性能。
- 使用
通过上述方法,你可以灵活实现从简单规则到复杂算法的全部分词需求。
2万+

被折叠的 条评论
为什么被折叠?



