第四天 分布式搜索引擎ElasticSearch

第四天笔记

反馈

1 怎么回答数据库优化面试问题?

如果是问数据库设计这块,完全可以说这块没有做过,因为任何一家公司都有数据库DB来设计表结构,根据当前业务,合理设计表结构也是可以提升操作效率的。

实际设计中,很少会把主外键、中间表给填上,只是逻辑上是一对多、多对多的关系。其实,也考虑到了扩展性,避免业务更换时带来的麻烦。

数据库查询语句优化:

  1. 避免 select * 去查询,使用 * 是全表扫描。比如本表有20个字段,你就把所有字段一个个写出来,也比 使用 * 查询效率高。
  2. 避免全表扫描,比如 not in ,!=等都是全面扫描。凡是非什么的一般都是全表扫描,具体等于什么的,都不是全表扫描。not in 或者in 可以使用not exist 或 exist代替

2 SpringDataJpa中方法命名和jpql选哪个用都可以吗,就是说两者是不同方式实现同一效果?

SpringDataJpa使用的面向对象的查询语句的名字就叫 jpql,两者是一个东西。Hibernate用的是hql。

分布式搜索引擎ElasticSearch

学习目标
了解其特点与体系架构
熟悉操作方式,具体操作es有三种方式:

  1. 使用 RestAPI进行操作
  2. 使用Head插件操作,是一个操作es的图形化界面
  3. 使用SpringDataElasticSearch 完成搜索微服务的开发--------重点,通过java操作es的一个技术

使用logstash完成 mysql 与 ES的同步工作,因为这些数据都是来源与数据库。
使用 IK分词器进行分词
完成ES 在 docker 上的安装

注意
面试注意要知道每个技术是干啥用的,比如Head插件是一个操作es的图形化界面;SpringDataElasticSearch是一个通过java操作es的技术。IK是分词器;logstash是一个用于同步es和数据库数据的工具。

搜索流程

在百度上搜索某一字条,是从百度的索引库中查询数据,这些数据是百度通过爬虫手段,从网上爬到的,将这些数据(标题、简介、爬虫来源:网址、图片等)存入百度的索引库中。

收集的资源来源:

  1. 网页上的资源:网页、博客、视频、音乐 —搜索引擎搜索:百度、谷歌
  2. 本公司数据库中的数据---------站内搜索:比较有代表性的淘宝、天猫、京东

这两种收集方式分别代表搜索中的哪两类:搜索引擎搜索、站内搜索

面试题:搜索分为几类?
重点内容:站内搜索

es简介

Elasticsearch是一个实时的分布式搜索和分析引擎
sola不支持分布式,需要借助插件进而支持分布式
特点

  1. 可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公 司;也可以运行在单机上
  2. 开箱即用(直接解压缩,不用安装),部署简单。
  3. 将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的ES;
  4. 全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理

体系结构
Elasticsearch与关系型数据库Mysql 的对应关系
索引(index) ----数据库(databases)
类型(type)---- 表(table)
文档(document) ------行(row)

主键只有一个索引,并且是自带索引,不是我创建的

从事编程这一行,虽然不一定都要会,但是要清楚到哪里找资料。

使用Head插件操作es

查询操作是在数据浏览中: 选中一个数据库,就是查询该数据库所有数据,选中两个,就是查询两个数据库的所有数据。
想看数据详情,就点击对应的文档。

增删改操作是在复合查询中。

IK分词器

提供了两种分词算法 ik_smartik_max_word
ik_smart: 表示最少切分;
ik_max_word:表示最细粒度切分(分词更多,比如中国人 可以分为中国人 和中国 而最少切分 直接分为中国人即可)

添加定制词汇时,要注意加一个空格

搜索微服务

注意: 搜索是到索引库里查,而不是连接数据库查询。

java连接 ElasticSearch 使用的端口号是 9300

添加文章模块

数据库中的最小单位是文档,就是一条记录。所以在 实体类上要加 @Document 注解
@Document(indexName = “”, type = “”): indexName 表示数据库的名称; type 表示数据库表的名称。

Field: 域,对应数据库中的列。
index = true 表示该列是索引
@Fiel(index = true)
@Field(index= true ,analyzer=“ik_max_word”, searchAnalyzer= “ik_max_word” )
面试题: 某列是否是索引,有什么区别?索引是怎么找 不是索引怎么找
是否索引 就是看该域是否能被搜索。
是否分词 就是表示是整体匹配还是分词。
是否存储 就是是否在页面上显示。

查询文章模块

elasticsearch 与 MySQL数据同步

logstash工具(重点)

Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集 起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。

注意:-f 是在后面跟一个文件; -e是后面跟一个语句
ctrl + c : 退出 logstash 登录

logstash ‐e/f 'input { stdin { } } output { stdout {} }'  

MySQL 数据导入 ElasticSearch 中

mysql-conf 是 MySQL数据库和 ElasticSearch 同步的模板文件。

Elasticsearch Docker环境下安装

1.下载镜像

docker pull elasticsearch:5.6.8

2.创建容器

docker run ‐di ‐‐name=tensquare_elasticsearch ‐p 9200:9200 ‐p 9300:9300 elasticsearch:5.6.8

让容器中 9300 端口库用

进入 es容器里面: exec

docker exec -it tensquare_elasticsearch(容器的名称) /bin/bash(内存中运行的路径)

问题

问题1 ElasticSearch 和 Solr 的区别

ElasticSearch 和 Solr 搜索用的索引是倒排索引,即一个词条对应一个文档。两者的区别在于:前者适合用于实时搜索应用,后者不适合,创建索引时会产生 io 阻塞。后者也比前者更成熟。

轮子效应,即代码可重用。

问题2 RedisTemplate中以ops开头的方法和以 bound开头的方法的区别?mongodb 和 redis 的区别?

答:以 bound开头的方法一般用于对缓存中的数据进行修改、删除或者进行逻辑的查询,而前者是用于存和取数据。

redis作为缓存数据库,结构是key value;
mongdb是非关系型数据库中,最像关系型数据库的,一般用于存储。前者是作为缓存用。

你可能感兴趣的:(分布式)