ElasticSearch-分词&安装ik分词器&自定义分词库&SpringBoot整合
一个tokenizer(分词器)接收一个字符流,将之分割为独立的tokens(词元,通常是独立的单词),然后输出tokens流。
例如:whitespace tokenizer遇到空白字符时分割文本。它会将文本"Quick brown fox!"分割为[Quick,brown,fox!]
该tokenizer(分词器)还负责记录各个terms(词条)的顺序或position位置(用于phrase短语和word proximity词近邻查询),以及term(词条)所代表的原始word(单词)的start(起始)和end(结束)的character offsets(字符串偏移量)(用于高亮显示搜索的内容)。
elasticsearch提供了很多内置的分词器(标准分词器),可以用来构建custom analyzers(自定义分词器)。
关于分词器: https://www.elastic.co/guide/en/elasticsearch/reference/7.6/analysis.html
但是对于中文,我们需要安装额外的分词器
安装IK分词器
所有的语言分词,默认使用的都是“Standard Analyzer”,但是这些分词器针对于中文的分词,并不友好。为此需要安装中文的分词器。
注意:不能用默认elasticsearch-plugin install xxx.zip 进行自动安装。IK分词器的版本跟ES的版本一一对应
https://github.com/medcl/elasticsearch-analysis-ik/releases
在前面安装的elasticsearch时,我们已经将elasticsearch容器的“/usr/share/elasticsearch/plugins”目录,映射到宿主机的“ /mydata/elasticsearch/plugins”目录下,所以比较方便的做法就是下载“/elasticsearch-analysis-ik-7.4.2.zip”文件,然后解压到该文件夹下即可。安装完毕后,需要重启elasticsearch容器。
测试分词器
GET _analyze
{
"analyzer": "ik_smart",
"text":"我是中国人"
}
GET _analyze
{
"analyzer": "ik_max_word",
"text":"我是中国人"
}
自定义词库
比如我们要把笑一笑算作一个词
- 修改/usr/share/elasticsearch/plugins/ik/config中的IKAnalyzer.cfg.xml
IK Analyzer 扩展配置
http://192.168.56.10/es/fenci.txt
修改完成后,需要重启elasticsearch容器,否则修改不生效。docker restart elasticsearch
更新完成后,es只会对于新增的数据用更新分词。历史数据是不会重新分词的。如果想要历史数据重新分词,需要执行:
POST my_index/_update_by_query?conflicts=proceed
远程扩展词典
搭配nginx做远程扩展词典
# 远程扩展词典路径http://192.168.56.10/es/fenci.txt
mkdir /mydata/nginx/html/es
cd /mydata/nginx/html/es
vim fenci.txt
输入 笑一笑
测试效果:
GET _analyze
{
"analyzer": "ik_max_word",
"text":"我是笑一笑"
}
SpringBoot整合
官方文档使用手册
- 导入依赖,这里的版本要和所按照的ELK版本匹配
org.elasticsearch.client
elasticsearch-rest-high-level-client
7.4.2
- 在spring-boot-dependencies中所依赖的ES版本位6.8.5,要改掉
1.8
7.4.2
请求测试项,比如es添加了安全访问规则,访问es需要添加一个安全头,就可以通过requestOptions设置
官方建议把requestOptions创建成单实例
@Configuration
public class GuliESConfig {
public static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
COMMON_OPTIONS = builder.build();
}
@Bean
public RestHighLevelClient esRestClient() {
RestClientBuilder builder = null;
// 可以指定多个es
builder = RestClient.builder(new HttpHost(host, 9200, "http"));
RestHighLevelClient client = new RestHighLevelClient(builder);
return client;
}
}