一、引入背景
最近手头有一个项目是一个关于补贴测算的,测算记录需要存储起来方便后面的检索,很多都是利用汉字或者手机号进行模糊搜索,尤其在管理端,没有了某个用户的筛选条件会造成比较大的查询压力,因此使用like不足以支撑目前的需求。故计划引入全文检索组件。方便小伙伴们一起学习故从环境搭建开始写
二、组件选型 ES VS solr
之前做过爬虫的项目为了方便文章内容的检索使用过solr,solr总体来讲还是比较老牌的,但是solr的扩展性比不上ES,集群管理solr是通过 apache的zookeepr,ES则自己内嵌了自带的,从运维便利性上ES可能更好一些。在决定使用ES之前在多个周末时间也翻阅了ES的官网的很多文档,总体来讲上手来说不难,包括后面的一些简单的数据分析,统计,sql的兼容性感觉上都要略胜一筹。
三、实验环境的搭建
基础要求,电脑安装jdk8及以上版本
node环境,因为要使用elasticsearch head这个es前端组件(es自己不带前端)
因为我的电脑是windows版本为了方便将简单测试环境进行构建完成,并搭建好检索与保存的基础代码,所以暂时先下载windows版本进行环境的搭建。
1.ES的安装
- 从官网下载最新的 elasticsearch 7.10.1 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.1-windows-x86_64.zip
linux 下载地址 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.1-linux-x86_64.tar.gz
找到 解压目录/bin/elasticsearch.bat 双击等待启动完成,
访问 http://localhost:9200
image.png
看到 you know for search,恭喜你进入了es的大门。
一个单节点的es就被搭建出来了。后面的文章会将集群搭建也梳理出来。
2、IK分词器的安装
做中文检索目前开源的大家建议使用ik分词器,ik的词也比较灵活,比如之前做过的资讯的一款产品中,因为有很多新词,当时是跑了一个新词发现的算法,印象很深的"洪荒之力",“洪荒少女”,这些互联网词语不好检索,那么使用扩展词典重新进行分词索引就能命中出来了。
下载地址 https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.10.1/elasticsearch-analysis-ik-7.10.1.zip
下载后解压放到 es安装目录下的plugins目录下,
完成后重启ES 查看启动日志找到 组件被加载就成功了
下面分享一个IK分词器知识点
IK的开源组件能够支持我们进行上文提到的新词添加,也就是分词词典热更新,小弟特意去git上面下载了代码然后找到了这段实现的逻辑,做学问肯定是要知其然也要知其所以然嘛,此处需要掌声!!!他的实现逻辑就是IK启动了一个定时线程
private static ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);
/**
* 词典初始化 由于IK Analyzer的词典采用Dictionary类的静态方法进行词典初始化
* 只有当Dictionary类被实际调用时,才会开始载入词典, 这将延长首次分词操作的时间 该方法提供了一个在应用加载阶段就初始化字典的手段
*
* @return Dictionary
*/
public static synchronized void initial(Configuration cfg) {
if (singleton == null) {
synchronized (Dictionary.class) {
if (singleton == null) {
singleton = new Dictionary(cfg);
singleton.loadMainDict();
singleton.loadSurnameDict();
singleton.loadQuantifierDict();
singleton.loadSuffixDict();
singleton.loadPrepDict();
singleton.loadStopWordDict();
if(cfg.isEnableRemoteDict()){
// 建立监控线程
for (String location : singleton.getRemoteExtDictionarys()) {
// 10 秒是初始延迟可以修改的 60是间隔时间 单位秒
pool.scheduleAtFixedRate(new Monitor(location), 10, 60, TimeUnit.SECONDS);
}
for (String location : singleton.getRemoteExtStopWordDictionarys()) {
pool.scheduleAtFixedRate(new Monitor(location), 10, 60, TimeUnit.SECONDS);
}
}
}
}
}
}
看的很清楚,这就是IK插件的源码截取部分,我们可以看到如果开启了远程词典配置,系统启动了一个监控线程每60秒去请求一次词典文件是否有更新,有更新则进行ik分词器词典的更新。
- 监控流程:
- ①向词库服务器发送Head请求
- ②从响应中获取Last-Modify、ETags字段值,判断是否变化
- ③如果未变化,休眠1min,返回第①步
- ④如果有变化,重新加载词典
- ⑤休眠1min,返回第①步
作者给我们的建议是将词典放到ng下面。然后配置IK 组件下面config/IKAnalyzer.cfg.xml
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict"></entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
- remote_ext_dict 为公共读取的互联网地址 代表扩展字典内容
- remote_ext_stopwords 同理也是配置为互联网公共地址,这是停止字典
这里有一个注意点就是如果ES中已经有索引过的文档的话,新的词典如果要生效需要 reindex,不然不会生效,这里的热更新指的是分词这个组件的能力,或者是生效于后面的新进入ES的文档。
3、下面我们安装 elasticsearch head
下载地址 https://github.com/mobz/elasticsearch-head 这是一个前端项目,将项目克隆到本地,然后run起来就可以。
这里面有一个注意事项第一次打开页面会出现跨域问题,head前端的访问端口是 9100, 而es的访问端口是9200,肯定会存在跨域问题,因为还要修改es的跨域配置 找到 \elasticsearch-7.10.1\config\elasticsearch.yml 在文件中添加
#开启跨域访问支持,默认为false
http.cors.enabled: true
#跨域访问允许的域名地址,(允许所有域名)以上使用正则
http.cors.allow-origin: /.*/
重启es, 再刷新head前端项目的页面,发现能够看到es的数据了
4、安装kibana
我们多数操作都是通过kibana来完成的,并且kibana自己带语法提醒所以安装一下kibana还是有必要的一样kibana 也是区分不同操作系统的我们测试环境使用windows版本
windows: https://artifacts.elastic.co/downloads/kibana/kibana-7.10.1-windows-x86_64.zip
linux : https://artifacts.elastic.co/downloads/kibana/kibana-7.10.1-linux-x86_64.tar.gz
下载完成后一样是解压即用,因为kibana支持了i18n所以可以支持配置为中文模式
进入 打开kibana-7.10.1-windows-x86_64\config\kibana.yml添加
i18n.locale: "zh-CN"
然后进入bin目录,启动kibana.bat完成启动,打开http://localhost:5601
至此kibana安装完成。后面会着重使用kibana里面的开发工具进行索引创建,以及文档增删改查
。
在创建索引中会涉及到索引分为几个分片,留几个备份,这涉及到一些集群规划后面再将项目需求完成后会再写一篇正式环境的集群构建,需要启动我拥有洪荒之力的本地虚拟机了。哈哈哈哈哈
未完待续元旦假期宅家更新,基础语法 以及springboot 整合 HighlevelRestApi