今年工作的一个重点是“新技术新模式”的导入和研究。Elasticsearch技术比较火,各项目和产品用的都也比较多。其中某团队遇到一个问题:“在TB级的数据量下进行全文检索时,ES集群检索响应速度比较慢”。虽然由于各种原因没有接触到系统,没有看到代码,甚至都没见到具体现象,但是任务分配下来了,就要有结果就要出方案。“没吃过猪肉,也得先见见猪跑”,先在一个30GB级别的ES集群下做一下优化研究。
字符过滤器(char filters)
主要职责是在分词器前过滤字符流,在源字符流中添加、删除、替换字符。一个分析器中可以有0个或多个字符过滤器。主要包括:html char filter、mapping char filter等。
分词器
主要职责是将接收到的字符流,按照某些规则切分成若干个“词”,并记录这些“词”在源字符串中的位置。比如将“我爱你”切分成"我"、“爱”、“你”、“我爱”,“爱你”,“我爱你”等等。分析器中有且只能有一个分词器。
分词过滤器
主要职责是将分好的“词”进行某种规则的过滤,可以添加、移除、替换“词”,但是不能修改“词”在源字符串中的相对位置。一个分析器中可以有0个或多个分词过滤器。常用的分词过滤器包括:大小写转换过滤器、停用词过滤器、同义词过滤器、拼音过滤器 等等
一个分析器可以有字符过滤器、分词器、分词过滤器自由组合,形成新的自定义的分析器。
分析器有很多种,有ES内置的和社区提供的。其中主流的分析器包括:standard 、ansj、ik、smartcn、icu、mmseg、pinyin,且均能支持中文分词。
#查看集群安装的分析器插件
GET /_nodes/plugins
#结果:
...
"plugins": [
{
"name": "analysis-icu",
"version": "5.5.1",
"description": "The ICU Analysis plugin integrates Lucene ICU module into elasticsearch, adding ICU relates analysis components.",
"classname": "org.elasticsearch.plugin.analysis.icu.AnalysisICUPlugin",
"has_native_controller": false
},
{
"name": "analysis-ik",
"version": "5.5.1",
"description": "IK Analyzer for Elasticsearch",
"classname": "org.elasticsearch.plugin.analysis.ik.AnalysisIkPlugin",
"has_native_controller": false
},
{
"name": "analysis-mmseg",
"version": "5.5.1",
"description": "Mmseg Analyzer for Elasticsearch",
"classname": "org.elasticsearch.plugin.analysis.mmseg.AnalysisMMsegPlugin",
"has_native_controller": false
},
{
"name": "analysis-pinyin",
"version": "5.5.1",
"description": "Pinyin Analysis for Elasticsearch",
"classname": "org.elasticsearch.plugin.analysis.pinyin.AnalysisPinyinPlugin",
"has_native_controller": false
},
{
"name": "analysis-smartcn",
"version": "5.5.1",
"description": "Smart Chinese Analysis plugin integrates Lucene Smart Chinese analysis module into elasticsearch.",
"classname": "org.elasticsearch.plugin.analysis.smartcn.AnalysisSmartChinesePlugin",
"has_native_controller": false
},
{
"name": "elasticsearch-analysis-ansj",
"version": "5.5.1.0",
"description": "elasticsearch analysis by ansj",
"classname": "org.ansj.elasticsearch.plugin.AnalysisAnsjPlugin",
"has_native_controller": false
}
]
...
查看比较火的ik分词器效果:
GET /medcl/_analyze
{
"text": "武汉市长江大桥",
"analyzer": "ik_max_word"
}
#结果:
{
"tokens": [
{
"token": "武汉市",
"start_offset": 0,
"end_offset": 3,
"type": "CN_WORD",
"position": 0
},
{
"token": "武汉",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 1
},
{
"token": "市长",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 2
},
{
"token": "长江大桥",
"start_offset": 3,
"end_offset": 7,
"type": "CN_WORD",
"position": 3
},
{
"token": "长江",
"start_offset": 3,
"end_offset": 5,
"type": "CN_WORD",
"position": 4
},
{
"token": "大桥",
"start_offset": 5,
"end_offset": 7,
"type": "CN_WORD",
"position": 5
}
]
}
分析器 | 分词效果 |
---|---|
standard | “武”、“汉”、“市”、“长”、“江”、“大”、“桥” |
ik | “武汉市”、“武汉”、“市长”、“长江大桥”、“长江”、“大桥” |
smartcn | “武汉市”、“长江”、“大桥” |
ansj | “武汉市”、“长江”、“大桥” |
mmseg | “武汉”、“市”、“长江”、“大桥” |
icu | “武汉”、“市”、“长江”、“大"、"桥” |
结论:smartcn和ansj是比较准确和智能的分析器
部署架构优化
在部署方式上应该采用分布式思想。
ES实例参数优化
ES查询语句优化