使用ElasticSearch、elasticsearch-head-master、ik分词器根据中文分词后高亮搜索

安装
文件链接: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.csdn.net/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
		
	








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值