简介:
应用场景:
如:当系统数据量上了10亿、100亿条的时候,我们在做系统架构的时候通常会从以下角度去考虑问题:
1)用什么数据库好?(mysql、sybase、oracle、达梦、神通、mongodb、hbase,ProgreSQL…)
2)如何解决单点故障;(lvs、F5、A10、Zookeeper、MQ)
3)如何保证数据安全性;(热备、冷备、异地多活)
4)如何解决检索难题;(数据库代理中间件:MyCat、mysql-proxy、S-Jdbc、Saga等;)
5)如何解决统计分析问题;(离线、近实时)
传统解决方案:
对于关系型数据,我们通常采用以下或类似架构去解决查询瓶颈和写入瓶颈:
解决要点:
1)通过主从备份解决数据安全性问题;
2)通过数据库代理中间件心跳监测,解决单点故障问题; 3)通过代理中间件将查询语句分发到各个slave节点进行查询,并汇总结果
非关系型数据库的解决方案:
对于Nosql数据库,以mongodb为例,其它原理类似:
解决要点:
1)通过副本备份保证数据安全性;
2)通过节点竞选机制解决单点问题; 3)先从配置库检索分片信息,然后将请求分发到各个节点,最后由路由节点合并汇总结果
在一些大型门户网站、电子商务网站等都需要站内搜索功能,使用传统的数据库查询方式实现搜索无法满足一些高级 的搜索需求,比如:搜索速度要快、搜索结果按相关度排序、搜索内容格式不固定等,这里就需要使用全文检索技术 实现搜索功能。
主流的全文检索技术:
1、Lucene
单独使用Lucene实现站内搜索需要开发的工作量较大,主要表现在:索引维护、索引性能优化、搜索性能优化等, 因此不建议采用。
2、Solr
基于Solr实现站内搜索扩展性较好并且可以减少程序员的工作量,因为Solr提供了较为完备的搜索引擎解决方案,因 此在门户、论坛等系统中常用此方案。
3、Elasticsearch Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可 以扩展到上百台服务器,处理PB级别的数据。
Solr
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更 为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
Solr可以独立运行,运行在Tomcat、Jetty等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功 能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
ElasticSearch
Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可 以扩展到上百台服务器,处理PB级别的数据。 Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单 Solr也是搜索引擎 基于Lucene
核心:
1、数据存储 海量 实时
2、数据检索 实时
Elasticsearch数据模型 关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns) Elasticsearch ⇒ 索引(Index) ⇒ 类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields)
可以包含多个索引(数据库),也就是说其中包含了很多类型(表)。这些类型中包含了很多的文档(行),然后每个文档中 又包含了很多的字段(列)。Elasticsearch的交互,可以使用Java API,也可以直接使用HTTP的Restful API方式
Elasticsearch索引
一切设计都是为了提高搜索的性能
1、倒排索引(Inverted Index)也叫反向索引
适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列 表。
Term(单词):一段文本经过分析器分析以后就会输出一串单词,这一个一个的就叫做Term(直译为:单词)
Term Dictionary(单词字典):顾名思义,它里面维护的是Term,可以理解为Term的集合 Term Index(单词索引):为了更快的找到某个单词,我们为单词建立索引
Posting List(倒排列表):倒排列表记录了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信 息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词
Java操作ES的方式
Java程序操作ES服务器有2种方式:
1、ES 的客户端 Transport
2、Spring Data Elasticsearch
Spring Data 系列:
Spring给出的操作一切数据的框架
1、Spring Data JPA
2、Spring Data Redis
3、Spring Data ElasticSearch
存储数据:
1、数据库 关系型数据库 Mysql Oracle
2、NO-SQL数据库 Redis
3、全文检索技术(搜索引擎技术) ElasticSearch
SpringBoot和ES
1.配置文件:
spring:
data:
elasticsearch:
cluster-name: xxxx
cluster-nodes: xxxx:9300
2.实体类:
@Document(indexName = "sily_wei",type = "food")
@Data
public class Food {
@Id
private Integer id;
private String name;
private String info;
}
3.dao层:
public interface FoodDao extends ElasticsearchCrudRepository<Food,Integer> {
}
4.service层:
public interface FoodService {
//新增 数据 ---ES
void save(Food food);
//查询 ---ES
Iterable<Food> queryAll();
}
@Service
public class FoodServiceImpl implements FoodService {
@Autowired
private FoodDao foodDao;
@Override
public void save(Food food) {
foodDao.save(food);
}
@Override
public Iterable<Food> queryAll() {
return foodDao.findAll();
}
}
5.controller层:
@RestController
public class FoodController {
@Autowired
private FoodService foodService;
//查询全部
@GetMapping("/api/food/all.do")
public Iterable<Food> all(){
return foodService.queryAll();
}
//新增
@GetMapping("/api/food/save.do")
public String save(Food food){
foodService.save(food);
return "OK";
}
}
依赖jar包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>