为什么要在项目中使用
搜索功能会产生巨大的资源消耗,沉重的数据库加载会拖垮整个应用性能,所以我们将搜索功能转移到一个外部的搜索服务器,减轻数据库的压力。es是基于Lucene(全文检索引擎工具包)的高性能搜索服务。使用于高并发的搜索应用程序。
- 在项目中使用 Spring Data ElasticSearch
- 简化ES的java客户端开发,底层封装了ES的客户端官方API
倒排索引
倒排索引:是搜索引擎的核心。由于正排索引的检索耗时太长,所以一般我们使用的搜索引擎都为倒排索引,是以word(关键字)作为索引。其实就是建立词语和文档的对应关系,词语哪篇文档中出现,在哪个位置出现,出现了几次。
详见:https://blog.csdn.net/zhanggaokai/article/details/76563206
ElasticSearch的优点
- 近乎实时的存储、检索数据。
- 扩展性好,可拓展至上百台服务器。
- 处理数据量大。
对比solr
solr | Es |
---|---|
利用zookeeper进行分布式管理 | 自带分布式协调管理功能 |
支持的格式多 | JSON格式 |
自动功能多 | 需通过第三方插件 |
适用于传统搜索应用 | 使用于实时搜索应用 |
为什么不使用solr
- solr在传统的搜索应用中性能高于ES,但在处理实时搜索时的效率低于ES;
- 对已有数据搜索时,solr更快,但在建立索引时,solr会产生IO阻塞,查询性能差;
- 随着数据量的增加,solr的搜索效率会减低,ES不变。
关系型数据库和ES的对应关系
关系型数据库 | 数据库 | 表(table) | 行(rows) | 列(columns) |
---|---|---|---|---|
ES服务 | 索引库 | 类型(types) | 文档(document) | 字段(fields) |
安装部署ElasticSearch,集成分词器(略)
- 参考网络文档
依赖jar包
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.1.3.RELEASE</version>
</dependency>
SpringDataElasticSearch注解
-
@Document : 将实体类映射成一篇文档
iddexName 指定索引库名称
type 指定索引库的类型(类似数据库中的表) -
@Id : 主键
-
@Field : 将数据库表中的列转化成文档中的Field
store: 是否存储 true存储|false不存储(默认为false)
index: 是否建立索引true建立|false不建立(默认为true)
type: 指定该Field的数据类型
analyzer: 指定建立索引时的分词器
searchAnalyzer: 指定搜索时的分词器
copyTo: 复制到哪个Field(将多Field复制到一个Field,方便指定搜索条件)
pattern: 日期类型,需要指定日期格式器
Spring整合ES
- 创建数据表对应实体类,用注解方式进行映射(略)
- 配置SpringDataElasticsearch.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/elasticsearch
http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd">
<!-- 2.配置Elasticsearch客户端连接对象