目标:与JAVA系统集成,掌握基本的ES JAVA API 使用
一、什么是搜索引擎,能解决什么问题
搜索的场景: 相关性、贴近用户选择,筛选精准,自动提示,错字识别,且速度要快
例:电商---「京东筛选电脑事例」
百度搜索,关键字关键词匹配,权重排序广告排名
在github 上搜索代码
二、ES为什么能胜任搜索引擎工作
1、底层使用Lucene引擎实现,默认情况下会将所有数据进行索引
Lucene倒排索引有助于速度的提升
倒排索引示例:「存储搜索文章索引数据」
上图中的意思是:左侧为原始数据,右侧是倒排索引数据,倒排索引中提取关键字标签,然后记录了含有该关键字的标号,那么比如说搜索peace关键字,可以立即找寻到2,3,4的博客,不再关注1。
2、相关性描述:算法评分相关性倒序
TF-IDF算法(词频-逆文档频率)
词频:关键字在查询内容中出现的频率
逆文档频率:如果某个单词在所有文档中比较少见,在某篇中权重高,则该词权重越高,得分越高
3、超越精确匹配
1> 处理错误拼写 2> 支持变化「近义词,相关性」3> 聚集统计数据「全内容统计相关性,提取归类,缩小用户选择范围」
4> 建议器「自动补全自动提示」
三、典型使用场景
主要后端系统,支持存储、搜索、统计,多机进行复制备份
添加到现有系统中提供搜索相关支持
与现有工具协同使用
四、ES都有哪些功能
存储
搜索:查询和过滤器的使用「RESTFul API的暴露使用」
高级功能:缓存到实时性分析进行聚集分析、获取最流行标签、一组帖子平均流行度任意组合,获取每类标签中帖子平均流行度灵活的文档组织方式、多个索引单独搜索或同时搜索
五、ES与传统数据库
传统数据库 :行/很多列、分布在不同的数据表中,需要进行关联查询
Elasticsearch :文档键值对方式 优势:灵活性大;文档是具有层次结构的,可以将属于一个逻辑实体数据保持在同一个文档中
六、Solr 与 ES
七、安装
我这里使用了Docker的安装方式进行安装。
通过搜索我使用了第一个带有Kibana工具集成的stars最多的镜像
在构建容器时,需要注意端口的映射,至少要映射 9200(ES默认端口), 5601(Kibana默认端口),9300。
进入容器查看基础目录
bin:启动文件
config:配置文件
log4j2
jvm.options [jvm虚拟机硬件配置等]
elasticsearch.yml [集群、端口、目录、ip等]
lib [相关jar包]
logs [日志]
modules [功能模块]
plugins [插件(重要)比如 IK分词器]
八、与传统数据库概念做比较
索引:非常大的文档集合,相当于数据库中的库。建立完索引后会存储在分片上
类型:类似传统数据库中定义字段类型,ES在不定义的情况下,可以自动识别,当然提前定义好,最安全的方式。 7.X过时;8.X废弃
文档: es是面向文档的
一篇文档同时包含字段和对应的值,也就是key:value
包含层次结构,一个文档中包含自文档,就是JSON
灵活处理结构,不需要像数据库需提前定义好所有字段
九、使用
安装可视化界面工具 ES-head
ES-head 官方Docker镜像版本后续没有更新了,故我在普通镜像中使用git clone方式来进行构建
然后我将镜像提交到了 Docker Hub中
需要进入目录内运行 npm run start
构建镜像时候需要注意映射9100端口 成功以下图
十、ELK
Elaticsearch:基于Lucene、分布式、通过ResuFul方式进行交互的近乎实时搜索平台框架
Logstash:中央数据流引擎,从不同目标收集不同格式数据,然后过滤后输出到不同目的地「MQ/文件/redis/elasticsearch/kafka」
Kibana:可将ES的数据通过友好的页面展示出来,提供实时分析的功能
基本流程 : 收集清洗数据-->搜索,存储-->Kibana
十一、IK分词器插件分词
算法:
ik_max_word (最细粒度划分)
自定义中文搜索字典:
插件配置所在位置:
配置自己的my.dic 例:我这里配置一个"阿里巴"的名词
十一、REST风格
索引-创建索引规则
增删改查示例:
文档:
若不指定索引规则,ES默认会根据文档生成索引规则
查询:
1、
2、复杂查询
空格进行多关键字搜索
bool - (must 、should)
must (and)
should (or)
must not ( != )
filter (某字段范围)
sort (排序 asc desc)
类型keyword和text 关键字与文本 -- 关键字类型不支持分词查询的
term与match 精确与分词
term 精确查询 不使用分词器 将词识别一个词
match 使用分词器查询
_source 过滤字段--筛选显示的标签字段
from size 分页
hightlight 高亮
自定义高亮