版权声明:作者已开启版权声明,如转载请注明转载地址。 https://blog.csdn.net/qq_34829447/article/details/85957820
一.按全文搜索概述
1.全文搜索
- 数据结构
- 结构化:指具有固定格式或有限长度的数据,如数据库、元数据等
- 非结构化:指不定长或无固定格式的数据,如邮件,word文档等
- 非结构化数据的检索
- 顺序扫描法(Serial Scanning):适合小数据量文件
- 全文搜索(Full-text-Search):适合大数据量文件,将非结构化数据提取出来重新组织,使其有一定结构组织,再进行搜索
- 概念
- 全文搜索是一种将文件中所有文本与搜索项匹配的文字资料检索方法
2.全文搜索实现原理
- 建立文本库(建立搜索数据源)
- 建立索引(提取规律【规律就是索引,搜索策略】)
- 执行搜索(用户发起请求,通过解析请求做对应的处理,返回给用户)
- 过滤结果(不会一下把所有结果都给出,会分页等相关处理)
3.全文搜索实现技术
- 基于Java的开源实现
- Lucene
- ElasticSearch(自身带有分布式管理功能,只支持json,因为使用restful接口风格,实时搜索效率优于Solr)
- Solr(利用zokeeper分布式管理系统,支持json、xml等,在传统搜索应用中表现优于ES)
二.ElasticSearch简介
1.ES是什么
- 高度可扩展的开源全文搜索和分析引擎
- 快速地、近实时地对大数据进行存储、搜索和分析
- 用来支撑有复杂的数据搜索需求的企业级应用
2.ES特点
- 分布式搜索引擎【每个索引都使用可配置数量的分片、每个分片有多个副本、在多个副本上进行读取(搜索)】
- 高可用【某一个系统是单机系统,当崩溃时,系统则不可用;如果分布式,分布到多个主机上,任意一个主机挂掉了,其余主机仍然可以提供服务】
- 支持多种数据类型
- 多API【支持http的restful,也支持原生的javaAPI】
- 面向文档【不需要事先定义模式,可以直接创建文档,可以自定义索引】
- 异步写入【性能更高】
- 近实时
- 基于Lucene
- Apache协议
3.ES核心概念
- 近实时
- 每个n秒自动刷新
- 索引建立之后不会直接写入磁盘,而是缓存,根据刷新策略定期同步到磁盘中
- 集群
- 一个或多个节点的集合,用来保存应用的全部数据,并提供基于全部节点的集成式索引和搜索功能
- 每个集群都有一个默认的名称,默认为elasticsearch
- 节点
- 集群中的单台服务器
- 用来保存数据和参与整个集群中的索引和搜索操作
- 每个节点都有一个默认的名称,默认为UUID标识,默认创建时被加入elasticsearch名称的集群
- 索引
- 用来加快搜索速度
- 在ES中,索引是相似文档的集合
- 类型
- 在索引中对包含文档的进一步细分
- 根据文档的公共属性来划分
- 如根据产品的特征划分不同的类型:一般产品、虚拟产品等
- 文档
- 进行索引的基本单位,与索引中的类型是相对应的
- 每一个具体的产品有一个文档与其对应
- 文档使用json格式进行表示
- 文档对应结构化数据中的实体,文档的实例对应结构化数据中的实体实例(具体的某个数据)
- 分片
- ES会将索引分成多个分片,用来存储索引中的部分数据
- 每一个分片中的数据还会建立一个副本
- ES会自动管理节点中的分片和副本
- 利用分片分布到多个节点上提高性能和吞吐量
- 副本
- 分片设置不同的副本
- 副本的作用在于创建副本预防故障,使其高可用
4.ES与SpringBoot集成
-
环境配置
- Elasticsearch2.4.4
- SpringDataElasticsearch2.1.3RELEASE【SpringData中的Elasticseach模块】
- JNA4.3.0【用来访问操作系统原生应用】
-
修改build.gradle
//依赖关系 dependancies { ... //添加Spring Data Elasticsearch的依赖 compile('org.springframework.boot:spring-boot-starter-data-elasticsearch') //添加JNA的依赖 compile('net.java.dev.jna:jna:4.3.0') ... }
三.Elasticsearch实战
1.修改application.properties
#ES服务地址
spring.data.elasticsearch.cluster-nodes=localhost:9300
#设置连接超时时间
spring.data.elasticsearch.properties.transport.tcp.connect_timeout=120s
2.创建实体
- 创建实体并实现Serializable序列化
- 满足JPA要求需要定义无参构造函数(JPA是java持久层API,是Hibernate子集)
- 用@Document标识实体表示是文档,设置indexName和type
3.创建接口
-
继承ElasticsearchRepository<实体类,Id类型>
-
实现方法实现全文搜索(从定义的字段中搜索),如下
//分页查询博客(去重)
Page<EsBlog> findDistinctEsBlogByTitleContainingOrSummaryContainingOrContentContaining(String title,String summary,String content,Pageable pageable);
//因为使用jpa则不需要写sql,参数中Pageable用于做分页,Pageable pageable = new PageRequest(0,20);表示要第一页中20条数据
4.实例代码调用逻辑
- 实例代码调用省略,直接编写controller/service调用即可
5.启动ES
- 开启ES服务
- 如果是window环境则执行下载ES安装包中的elasticsearch.bat,如果在linux环境下则执行elasticsearch文件
6.执行调用代码
- 则会实现全文搜索功能