- 1.ES解决什么问题?用MySQL不香么?MySQL搜索存在什么问题?ES用于哪些场景?
- 2.什么是倒排索引?你是如何理解的?
- 3.ES中 文档 是什么格式?ES搜索原理的核心是什么?
- 4.solr也可以做搜索,它跟ES的区别是什么?ES特性有哪些?项目中MySQL跟ES如何分工?
- 5.如何验证ES已经启动成功可以访问?
- 6.ES提供的访问协议是哪种?有哪些客户端可用工具?
- 7.ES中核心概念有哪些?
- 8.如何理解RESTful风格?
- 9.创建索引库用哪种请求方式?
- 10.ES中字段字符串类型中keyword、text二者有什么区别?ES中字段类型可以是对象么?
- 11.ES中可以更改字段类型么(修改映射)?映射关系(表结构)如何查看?如何创建映射关系?
- 12.文档如何添加?如何查询文档?
- 13.什么 是 分词器 ? 有 什么 用 ?ES 内置的 分词器 有 什么 问题 ?如何测试某段文本的分词结果?
- 14.什么是IK分词器,为什么要用它?ES默认的环境中是否包含IK分词器(IK分词器需要额外安装么)?
- 15.IK分词器有哪两种分词器模式?分别用于什么场景?
- 16.term 查询跟 match查询 有什么区别?创建索引库添加映射关系时需要指定某些字段使用的分词器么?
- 17.CreateIndexRequest是什么意思?
- 18.GetIndexRequest是来做什么的?DeleteIndexRequest呢?**
- 19.如何理解IndexRequest?
- 20.GetRequest是什么?
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 协议
工具:
- kibane: 用来连接ES , 实现 ES 的 快速访问
- postman: 可以用postman 来 测试ES 接口是否连通
- Head插件(已经被淘汰)
7.ES中核心概念有哪些?
- 索引 (index)
- 索引是ES 存储数据的地方, 相当于Mysql 中的 数据库
- 映射 (mapping)
- 映射 中定义了每个字段的类型和 字段所使用的分词器等 ,相当于Mysql中的表结构
- 文档 (document)
- 文档时ES中最小的数据单元, 常以 JSON格式 显示, 一个document数据就相当于 Mysql 中的一行数据
- 倒排索引
- 一个倒排索引是有文档中所有不重复词的列表构成 , 对于其中每个词 , 都对应一个包含它的文档id列表
- 类型 (type)
- 一种 type 就相当于一类表, 如用户表 , 角色表等.在ES 7.X中默认的type为_doc
- ES 5.X中 一个 index 中 可以有多种 type
- ES 6.X中 一个 index 中 只能有一种 type
- ES 7.X 以后,逐步移除了type这个概念 , 现在的操作已经不在使用, 默认_doc
8.如何理解RESTful风格?
是一种定义接口的规范(风格);基于HTTP协议,每一个URI代表一种资源,用不同的请求方式来分别代表对这个资源做不同的操作;
@RestController("/user")public class UserController {@GetMapping("")public PageResult<User> findUserList(/*参数*/){return null;}@PostMapping("")public Result<Boolean> addUser(/*参数*/){return null;}@PutMapping("")public Result<Boolean> updateUser(/*参数*/){return null;}@DeleteMapping("")public Result<Boolean> deleteUser(/*参数*/){return null;}}
9.创建索引库用哪种请求方式?

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

可以是对象类型 , 因为 ES的复杂数据类型中支持 数据 和 对象 类型
11.ES中可以更改字段类型么(修改映射)?映射关系(表结构)如何查看?如何创建映射关系?
ES中不支持修改 映射 , 但是可以添加字段 , 不能修改字段相关参数
查询索引库消息, 返回内容中包含的映射消息
可以单独查询映射
使用 PUT 方式添加映射信息
创建索引的同时添加映射关系
12.文档如何添加?如何查询文档?
添加文档有两种方式:
指定id添加文档 (如果id存在 , 则是用于更新)

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

查询文档的两种方式:
- 根据id查询文档

查询所有文档

根据id删除文档:

13.什么 是 分词器 ? 有 什么 用 ?ES 内置的 分词器 有 什么 问题 ?如何测试某段文本的分词结果?
分词器就是对一段文本内容进行分词的工具 (词典目录 , 分词算法)
ES内置分词器对中文很不友好, 默认是 按照一个字 一个词 来分 , 对英文很友好, 因为英文单词有空格 , 按照空格来进行分词
测试:

14.什么是IK分词器,为什么要用它?ES默认的环境中是否包含IK分词器(IK分词器需要额外安装么)?
中文分词工具包,对中文分词友好;而且支持用户自定义词典;
需要构建IK分词器组件,安装到ES中(插件目录);
15.IK分词器有哪两种分词器模式?分别用于什么场景?
分词模式:
- 粗粒度 (ik_smart)
会做最粗粒度的拆分,比如会将“乒乓球明年总冠军”拆分为乒乓球、明年、总冠军。
GET /_analyze{"analyzer": "ik_smart","text": "乒乓球明年总冠军"}
- 细粒度 (ik_max_word)
会将文本做最细粒度的拆分,比如会将“乒乓球明年总冠军”拆分为“乒乓球、乒乓、球、明年、总冠军、冠军。
GET /_analyze{"analyzer": "ik_max_word","text": "乒乓球明年总冠军"}
对于ik分词器建议是索引时使用ik_max_word将搜索内容进行细粒度分词,搜索时使用ik_smart提高搜索精确性.
**
应用场景:
用户输入关键字搜索时,对用户输入的内容分词匹配时,使用组粒度(ik_smart);用于搜索时;
当程序员要将一段内容存入索引表中时,使用细粒度(ik_max_worf)
16.term 查询跟 match查询 有什么区别?创建索引库添加映射关系时需要指定某些字段使用的分词器么?
区别:
某些字段如果想要对于中文分词友好,在创建映射关系时,需要指定使用IK分词器

17.CreateIndexRequest是什么意思?
创建索引库请求
参数为: 索引库名称
18.GetIndexRequest是来做什么的?DeleteIndexRequest呢?**
GetIndexRequest是用来查询索引库信息的一个请求对象;
DeleteIndexRequest用于删除索引库;
19.如何理解IndexRequest?
这里的Index是一个动词,IndexRequest是:一个索引(动词)请求,就是往索引库添加文档,其实就是一个 建立文档倒排索引 的过程。添加文档到ES中,也可以理解成索引文档到ES中;
索引文档到ES中:
20.GetRequest是什么?
GetRequest是一个查询文档的请求;区分GetIndexRequest(查询索引库信息);
DeleteRequest:删除文档,区分DeleteIndexRequest删除索引库;
