安装
文件链接:https://pan.baidu.com/s/1Ee6y8fHgI5uqMewxvtQTsA?pwd=ka8w
提取码:ka8w
项目地址:https://gitee.com/li-zehui/jdHighLight
Windows
解压安装就行
mac
安装ES
安装ES
brew install elasticsearch
运行
elasticsearch
访问
http://localhost:9200/
安装可视化head插件
去github下载zip包
https://github.com/mobz/elasticsearch-head
进入elasticsearch-head-master目录
npm install
npm start
两个服务head和elastic search都停掉
通过brew info elasticsearch查看ES的config文件路径
由于head插件与ElasticSearch是两个独立的进程,它们之间的访问会有跨域问题,则需要对ElasticSearch的配置进行相应的修改,执行编辑命令
vim /usr/local/etc/elasticsearch/elasticsearch.yml
在文件末端输入:
http.cors.enabled: true
http.cors.allow-origin: "*"
按ESC 输入 :wq
再次重启两个项目
安装kibana
安装
brew install kibanna
ElasticSearch
运行
使用前提:一定要检查自己的java环境是否配置好
访问环境
http://localhost:9200/
Elasticsearch-Head
数据展示插件
使用前提:需要安装nodejs
启动
cd elasticsearch-head# 安装依赖npm install# 启动npm run start# 访问http://localhost:9100/
安装依赖
运行
访问
存在跨域问题(只有当两个页面同源,才能交互)
同源(端口,主机,协议三者都相同)
https://blog.youkuaiyun.com/qq_38128179/article/details/84956552
开启跨域
在elasticsearch解压目录config下elasticsearch.yml中添加
# 开启跨域
http.cors.enabled: true# 所有人访问
http.cors.allow-origin: "*"
重启elasticsearch
再次连接
Kibana
版本要和Elastic Search一致
启动
访问
localhost:5601
ES核心概念
索引与文档
关系型数据库和ElasticSearch对比
Relational DB ElasticSearch
数据库(database) 索引(indices)
行(rows) documents
字段(columns) fields
elasticsearch(集群)中可以包含多个索引(数据库) ,每个索引下又包含多个文档(行) ,每个文档中又包含多个字段(列)。
文档(”行“)
之前说elasticsearch是面向文档的,那么就意味着索引和搜索数据的最小单位是文档,elasticsearch中,文档有几个重要属性:
• 自我包含,一篇文档同时包含字段和对应的值,也就是同时包含key:value !
• 可以是层次型的,一个文档中包含自文档,复杂的逻辑实体就是这么来的! {就是一个json对象 ! fastjson进行自动转换 !}
• 灵活的结构,文档不依赖预先定义的模式,我们知道关系型数据库中,要提前定义字段才能使用,在elasticsearch中,对于字段是非常灵活的,有时候,我们可以忽略该字段,或者动态的添加一个新的字段。
尽管我们可以随意的新增或者忽略某个字段,但是,每个字段的类型非常重要,比如一个年龄字段类型,可以是字符串也可以是整形。因为elasticsearch会保存字段和类型之间的映射及其他的设置。这种映射具体到每个映射的每种类型,这也是为什么在elasticsearch中,类型有时候也称为映射类型。
索引(“库”)
索引是映射类型的容器, elasticsearch中的索引是一个非常大的文档集合。 索引存储了映射类型的字段和其他设置。然后它们被存储到了各个分片上了。我们来研究下分片是如何工作的。
分片、副本与倒序索引
分片
一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有 10 亿文档数据
的索引占据 1TB 的磁盘空间,而任一节点都可能没有这样大的磁盘空间。 或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch 提供了将索引划分成多份的能力,每一份就称之为分片。
每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。
分片很重要,主要有两方面的原因:
1. 允许你水平分割 / 扩展你的内容容量。
2. 允许你在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量。
副本
在一个网络 / 云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于
离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的, Elasticsearch 允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片(副本)。
复制分片之所以重要,有两个主要原因:
1.在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原/主要(original/primary)分片置于同一节点 上是非常重要的。
2.扩展你的搜索量/吞吐量,因为搜索可以在所有的副本上并行运行。
系统架构
下面图就是一个ES集群,里面有三个ES实例(也就是三个节点)
P0、P1、P2就是索引切片
R0、R1、R2就是索引切片副本
切片和副本不能放在同一个节点上
每一个分片就是底层Lucence的索引,所以每一个分片都能进行查询
倒排索引
elasticsearch使用的是一种称为倒排索引的结构,采用Lucence作为底层,这种结构适用于快速的全文搜索
例如我们有两个文档,每个文档包含如下内容
Study every day, good good up to forever
To forever, study every day,good good up
为了创建倒排索引,我们首先要将每个文档拆成独立的词(或称词条、tokens),然后创建一个包含所有不重复的词条排序列表,然后列出每个词条出现在哪个文档
term doc_1 doc_2
Study √ ×
To × √
every √ √
forever √ √
day √ √
study × √
good √ √
to √ ×
up √ √
现在我们尝试去搜索to forever,只需要查看每个词条的文档
term doc_1 doc_2
to √ ×
forever √ √
total 2 1
两个文档都匹配,这两个包括关键字的文档,都将返回。但是第一个文档匹配程度比第二个文档高,权重会高
举例
通过博客标签来搜索博客文章,那么倒排索引就是这样的结构
从这里就能看到为什么叫倒排索引,正排索引是根据id,匹配内容,这个是内容去匹配id
博客文章(原始数据) 索引列表(倒排索引)
博客文章id 标签 标签 博客文章id
1 python python 1,2,3
2 python linux 3,4
3 linux,python
4 linux
ik分词器
就是一个中文分词器
IK提供了两个分词算法: ik_smart和ik_max_word ,其中ik_smart为最少切分, ik_max_word为最细粒度划分
下载
版本要与ElasticSearch版本对应
安装
加压即可(但是我们需要解压到ElasticSearch的plugins目录ik文件夹下)
3、重启ElasticSearch
加载了IK分词器
4、查看插件
E:\ElasticSearch\elasticsearch-7.6.1\bin>elasticsearch-plugin list
5、使用kibana测试
GET _analyze
{
"analyzer": "ik_smart",
"text": "年轻人不讲武德"
}
GET _analyze
{
"analyzer": "ik_max_word",
"text": "年轻人不讲武德"
}
ik_smart:最少切分
ik_max_word:最细粒度划分(穷尽词库的可能)
从上面看,感觉分词都比较正常,但是大多数,分词都满足不了我们的想法,如下例
那么,我们需要手动将该词添加到分词器的词典当中
6、添加自定义的词添加到扩展字典中
elasticsearch目录/plugins/ik/config/IKAnalyzer.cfg.xml
打开 IKAnalyzer.cfg.xml 文件,扩展字典
创建字典文件,添加字典内容
重启ElasticSearch,再次使用kibana测试
京东高亮搜索
效果
源码地址
https://gitee.com/li-zehui/jdHighLight
运行
启动项目,访问http://localhost:9999/是主界面
访问http://localhost:9999/parse/java :是在京东上搜索java,然后创建索引注入到ES中
访问http://localhost:9999/search/java/1/5:是在es中搜索java字段,第一页,每页五个数据
访问http://localhost:9999/highlightSearch/java/1/5:是在es中搜索java字段(java会高亮显示),第一页,每页五个数据
项目结构
依次介绍文件:
ContentController文件:上面介绍了三个接口对应了三个方法
IndexController文件:访问http://localhost:9999/显示主界面
Content文件:实体类,从京东搜到的数据塞到这里面了
ContentService文件:具体的代码逻辑
ElasticSearchConfig文件:ES的必要配置文件,用于访问ES以及一些文档操作
HtmlParseUtil文件:从京东上搜索字段,拿到数据的爬虫文件测试
resources文件夹:放着静态资源,从百度云下载就行
application.properties
# 更改端口,防止冲突server.port=9999# 关闭thymeleaf缓存spring.thymeleaf.cache=false
pom
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.2.5.RELEASE
com.example
jdHighLight
0.0.1-SNAPSHOT
jdHighLight
Demo project for Spring Boot
1.8
7.6.1
org.jsoup
jsoup
1.10.2
com.alibaba
fastjson
1.2.70
org.springframework.boot
spring-boot-starter-data-elasticsearch
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
runtime
true
org.springframework.boot
spring-boot-configuration-processor
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test