ElasticSearch

开源ElasticSearch是一个基于Lucene的实时分布式的搜索与分析引擎,是遵从Apache开源条款的一款开源产品,是当前主流的企业级搜索引擎。作为一款基于RESTful API的分布式服务,Elasticsearch可以快速地、近乎于准实时地存储、查询和分析超大数据集,通常被用来作为构建复杂查询特性和需求强大应用的基础引擎或技术。


Elasticsearch、Logstash和Kibana这三个技术就是我们常说的ELK技术栈

初识ElasticSearch

ElasticSearch概念和适用场景

ElasticSearch是一个开源的分布式全文检索和分析引擎,实时快速存储分析海量数据。
分布式、全文检索、实施快速、Restful

ElasticSearch VS MySQL

ElasticSearch、Kibana安装和部署

ElasticSearch与Kibana版本要对应
ElasticSearch: http://localhost:9200/
Kibana:http://localhost:5601/

postman、kibana对ES的交互

postman实例

  • 查看所有索引
    GET:http://localhost:9200/_all

  • 创建索引-test
    PUT:http://localhost:9200/test

  • 删除索引-test
    DELETE:http://localhost:9200/test

  • 创建索引-person
    PUT:http://localhost:9200/person

  • 新增数据-person-1
    PUT:http://localhost:9200/person/_doc/1

  • 新增数据-person-2
    PUT:http://localhost:9200/person/_doc/2

  • 新增数据-person-id
    GET:http://localhost:9200/person/_doc/1

  • 搜索数据-person-name
    GET:http://localhost:9200/person/_doc/_search?q=first_name:john

kibana实例

kibana管控台 -> Dev Tools

– 查询数据

POST /person/_search 
{
  "query":{
    "bool": {
      "should": [
        {
          "match": {
            "first_name": "Smith"
          }
        },
        {
          "match": {
            "about": "basketball"
          }
        }
      ]
    }
  }
}

博客网站全文检索

级域MySQL实现

MySQL建表语句:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_blog
-- ----------------------------
DROP TABLE IF EXISTS `t_blog`;
CREATE TABLE `t_blog`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(60)  DEFAULT NULL COMMENT '博客标题',
  `author` varchar(60) DEFAULT NULL COMMENT '博客作者',
  `content` mediumtext  COMMENT '博客内容',
  `create_time` datetime  DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime  DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8mb4;

SET FOREIGN_KEY_CHECKS = 1;

查询语句

select * from t_blog where title like '%spring%' or content like '%spring%'

高性能的索引策略

1、独立的列:

如果查询中的列不是独立的,则Mysql就不会使用索引。独立的含义是指索引列不能是表达式的一部分,也不能是函数的参数。

/*使用了表达式,不是独立的列,不会命中索引*/
select * from t_blog where id + 0 = 1;

2、like查询不能以%开头

# LIKE查询以%为开头,不会命中索引
select * from t_blog where title like '%spring%'

# LIKE查询不以%为开头,会命中索引
select * from t_blog where title like 'spring%'

3、列类型是字符串,一定要在条件中将数据使用引号引用起来

/*在name列有索引,字符串未用引号引用,不会命中索引*/
select * from t_blog where title = 123;

/*在name列有索引,字符串用引号引用,会命中索引*/
select * from t_blog where title = '123';

4、最左匹配原则

在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配, 删除所有索引,对列name、列address和列phone建一个联合索引

alter table `t_blog` add index index_combile ( `title`, `author`,`content`);

联合索引 ​​index_combile​​实际建立了​​(title)、(title,author)、(title,author,content)​​三个索引。所以下面的三个SQL语句都可以命中索引。

select * from t_blog where title= 'myGKHeCwAm';
select * from t_blog where title= 'myGKHeCwAm' and author= 'KPSTOrpBMf';
select * from t_blog where title= 'myGKHeCwAm' and content= 'pjZvejKYKF' and author= 'KPSTOrpBMf';

上面三个查询语句执行时会依照最左前缀匹配原则,检索时分别会使用索引进行数据匹配。索引的字段可以是任意顺序的。

基于ES实现

ES倒排索引工作原理

ES对新增的数据进行分词,可以使用内部支持的分词规则或特定的分词来实现,分词后ES会维护最小词源(Term)到文档ID的映射。

ES节点

MySQL、ES数据同步

全量、增量

全量:第一次建立完ES索引后,把MySQL数据一次性打包同步过去,这个过程是全量。
增量:以后MySQL产生新的数据(新插入的数据、以前老数据得到update、以前老数据得到delete),这三种情况同样需要同步到index去,让它对应的去做新增、更新、删除操作。

几种方式

开源中间件

MySQL的binlog订阅:它用于实时记录MySQL数据产生的变化。通过MySQL主从复制协议,自己实现客户端,和MySQL主节点连接,把自己伪装成slave节点(从节点),主节点发生数据变更,会将变更事件传递到客户端。

Binlog 即 Binary Log,是MySQL中的一种二进制日志文件。它可以记录MySQL内部对数据库的所有修改,设计Binlog最主要的目的是满足数据库主从复制和增量恢复的需要。

canal

阿里巴巴MySQL binlog增量订阅&消费组件

go-mysql-elasticsearch

logstash

Logstash是具有实时流水线能力的开源的数据收集引擎。Logstash可以动态统一不同来源的数据,并将数据标准化到您选择的目标输出。它提供了大量插件,可帮助我们解析,丰富,转换和缓冲任何类型的数据。

要求:
id:elasticsearc的下划线id