1.ES解决什么问题?用MySQL不香么?MySQL搜索存在什么问题?ES用于哪些场景?

ES主要用来解决海量数据的搜索问题

之所以不用MySql是因为他的模糊查询功能较弱,无法满足某些搜索业务场景; mysql where 条件 like ‘%关键字%’ 性能差,会造成全表扫描,所有查询效率低

ES主要用于做全文搜索.模糊匹配和海量数据的搜索. 想淘宝,京东这些项目的搜索等. C端用户 使用的 大多数 输入框 输入 关键字 的搜索 功能 都能用ES来实现

2.什么是倒排索引?你是如何理解的?

简单说: 倒排索引就是 词 和 文章id 的对应 关系 (需要使用数据结构维护)

详细来说,: 一个未经处理的数据库中, 一般是以文档id 作为索引 , 以文档 的 内容作为记录. 而 倒排索引 则是以 单词或者记录作为文档的索引, 将文档id 作为记录, 这样 便可以方便的通过 单词 或 记录 查询到其所在的文档

倒排索引由两个部分组成:单词词典和倒排文件。

3.ES中 文档 是什么格式?ES搜索原理的核心是什么?

格式是 JSON 格式 原理: 根据词条(分词 搜索倒排索引 , 从中获取 对应的 文章id , 进而获得文档数据

4.solr也可以做搜索,它跟ES的区别是什么?ES特性有哪些?项目中MySQL跟ES如何分工?

区别: solr 适合对 已经 存在的 数据 进行搜索 ES 适合做实时搜索, 也就是数据前一刻存入到ES中 后一刻就能被搜索出来

ES特性: ES是一个分布式 , 高扩展 , 高实时的 搜索与数据 分析 引擎, 所以他适合海量数据的搜索, 日志数据分析 和 实时分析

分工: 因为ES解放了MySql的搜索能力, 所以在 实际开发中 MySql赋值存储数据 ,ES负责搜索数据, 而且 数据会有一个 从 MySql 同步到 ES 的步骤

5.如何验证ES已经启动成功可以访问?

通过 浏览器访问 IP:9200(192.168.23.30:9200) 检查是否响应出JSON数据

6.ES提供的访问协议是哪种?有哪些客户端可用工具?

访问协议: RestFul 风格的 HTTP 协议

工具:

  1. kibane: 用来连接ES , 实现 ES 的 快速访问
  2. postman: 可以用postman 来 测试ES 接口是否连通
  3. Head插件(已经被淘汰)

7.ES中核心概念有哪些?

  1. 索引 (index)
    1. 索引是ES 存储数据的地方, 相当于Mysql 中的 数据库
  2. 映射 (mapping)
    1. 映射 中定义了每个字段的类型和 字段所使用的分词器等 ,相当于Mysql中的表结构
  3. 文档 (document)
    1. 文档时ES中最小的数据单元, 常以 JSON格式 显示, 一个document数据就相当于 Mysql 中的一行数据
  4. 倒排索引
    1. 一个倒排索引是有文档中所有不重复词的列表构成 , 对于其中每个词 , 都对应一个包含它的文档id列表
  5. 类型 (type)
    1. 一种 type 就相当于一类表, 如用户表 , 角色表等.在ES 7.X中默认的type为_doc
    2. ES 5.X中 一个 index 中 可以有多种 type
    3. ES 6.X中 一个 index 中 只能有一种 type
    4. ES 7.X 以后,逐步移除了type这个概念 , 现在的操作已经不在使用, 默认_doc

8.如何理解RESTful风格?

是一种定义接口的规范(风格);基于HTTP协议,每一个URI代表一种资源,用不同的请求方式来分别代表对这个资源做不同的操作;

  1. @RestController("/user")
  2. public class UserController {
  3. @GetMapping("")
  4. public PageResult<User> findUserList(/*参数*/){
  5. return null;
  6. }
  7. @PostMapping("")
  8. public Result<Boolean> addUser(/*参数*/){
  9. return null;
  10. }
  11. @PutMapping("")
  12. public Result<Boolean> updateUser(/*参数*/){
  13. return null;
  14. }
  15. @DeleteMapping("")
  16. public Result<Boolean> deleteUser(/*参数*/){
  17. return null;
  18. }
  19. }

9.创建索引库用哪种请求方式?

ElasticSearch基础 - 图1

10.ES中字段字符串类型中keyword、text二者有什么区别?ES中字段类型可以是对象么?

ElasticSearch基础 - 图2

可以是对象类型 , 因为 ES的复杂数据类型中支持 数据 和 对象 类型

11.ES中可以更改字段类型么(修改映射)?映射关系(表结构)如何查看?如何创建映射关系?

ES中不支持修改 映射 , 但是可以添加字段 , 不能修改字段相关参数
ElasticSearch基础 - 图3 查询索引库消息, 返回内容中包含的映射消息

ElasticSearch基础 - 图4 可以单独查询映射

ElasticSearch基础 - 图5 使用 PUT 方式添加映射信息

ElasticSearch基础 - 图6 创建索引的同时添加映射关系

12.文档如何添加?如何查询文档?

添加文档有两种方式:

  1. 指定id添加文档 (如果id存在 , 则是用于更新)

    ElasticSearch基础 - 图7

  2. 不指定id添加文档(会生成随机id)

    ElasticSearch基础 - 图8

查询文档的两种方式:

  1. 根据id查询文档
    ElasticSearch基础 - 图9
  2. 查询所有文档

    ElasticSearch基础 - 图10

根据id删除文档:
ElasticSearch基础 - 图11

13.什么 是 分词器 ? 有 什么 用 ?ES 内置的 分词器 有 什么 问题 ?如何测试某段文本的分词结果?

分词器就是对一段文本内容进行分词的工具 (词典目录 , 分词算法)

ES内置分词器对中文很不友好, 默认是 按照一个字 一个词 来分 , 对英文很友好, 因为英文单词有空格 , 按照空格来进行分词

测试:
ElasticSearch基础 - 图12

14.什么是IK分词器,为什么要用它?ES默认的环境中是否包含IK分词器(IK分词器需要额外安装么)?

中文分词工具包,对中文分词友好;而且支持用户自定义词典;

需要构建IK分词器组件,安装到ES中(插件目录);

15.IK分词器有哪两种分词器模式?分别用于什么场景?

分词模式:

  1. 粗粒度 (ik_smart)

会做最粗粒度的拆分,比如会将“乒乓球明年总冠军”拆分为乒乓球、明年、总冠军。

  1. GET /_analyze
  2. {
  3. "analyzer": "ik_smart",
  4. "text": "乒乓球明年总冠军"
  5. }
  1. 细粒度 (ik_max_word)

会将文本做最细粒度的拆分,比如会将“乒乓球明年总冠军”拆分为“乒乓球、乒乓、球、明年、总冠军、冠军。

  1. GET /_analyze
  2. {
  3. "analyzer": "ik_max_word",
  4. "text": "乒乓球明年总冠军"
  5. }

对于ik分词器建议是索引时使用ik_max_word将搜索内容进行细粒度分词,搜索时使用ik_smart提高搜索精确性.
**
应用场景:
用户输入关键字搜索时,对用户输入的内容分词匹配时,使用组粒度(ik_smart);用于搜索时;
当程序员要将一段内容存入索引表中时,使用细粒度(ik_max_worf)

16.term 查询跟 match查询 有什么区别?创建索引库添加映射关系时需要指定某些字段使用的分词器么?

区别:
ElasticSearch基础 - 图13

某些字段如果想要对于中文分词友好,在创建映射关系时,需要指定使用IK分词器

ElasticSearch基础 - 图14

17.CreateIndexRequest是什么意思?

创建索引库请求
ElasticSearch基础 - 图15
参数为: 索引库名称

18.GetIndexRequest是来做什么的?DeleteIndexRequest呢?**

GetIndexRequest是用来查询索引库信息的一个请求对象;
DeleteIndexRequest用于删除索引库;

19.如何理解IndexRequest?

这里的Index是一个动词,IndexRequest是:一个索引(动词)请求,就是往索引库添加文档,其实就是一个 建立文档倒排索引 的过程。添加文档到ES中,也可以理解成索引文档到ES中
索引文档到ES中:
ElasticSearch基础 - 图16

20.GetRequest是什么?

GetRequest是一个查询文档的请求;区分GetIndexRequest(查询索引库信息);
ElasticSearch基础 - 图17
DeleteRequest:删除文档,区分DeleteIndexRequest删除索引库;