Elasticseach黑马笔记
1.采用倒排索引
-
词条(term): 按语义分成的词语
-
文档(document):每条数据就是一个文档
2.es与mysql对比
- ES: 面向文档存储的,一条数据就是一个文档。
- 文档数据会被序列化json格式后存储在elasticsearch中
- 索引(index):相同类型的文档的集合,如:订单信息(订单索引)、人员信息(人员索引)。
- 映射(mapping): 索引中文档的约束,类似数据库中的表结构(Schema).
概念对比
架构
- Mysql: 擅长事务类型操作;可以确保数据的安全和一致性。
- Elasticsearch: 擅长海量数据的搜索、分析、计算。
3.安装
4.操作索引库(类似数据库中的表)
- mapping映射的属性
- 索引库的CRUD
4.1.mapping映射
- type: 字段数据类型,常见的类型:
- 字符串:text(可分词的文本)、keyword: (精确值,例如:品牌、国家、ip地址)
- 数值:long、integer、sort、byte、double、float
- 布尔:boolean
- 日期:date
- 对象:object
- index:是否创建索引(倒排索引),默认为true。
- analyzer:使用哪种分词器
- properties:该字段的子字段
4.2.索引库的CRUD
- 创建索引库
ES中通过Restful请求操作索引库、文档。请求内容用哪个DSL语句来表示。
**创建索引库和mapping的DSL语法如下:
**
-
查询、删除索引库
查看:
GET /索引库名称
如:GET /heima
删除:
DELETE /索引库名称
如:DELETE /heima
-
修改索引库
==ES中一般是禁止修改索引库;==但是可以添加新的字段,语法如下:
5.文档的操作(数据的操作)
-
新增文档
DSL语法:
-
查询文档,DSL语法:
-
删除文档,DSL语法:
修改文档
-
方式一:全量修改,会删除旧文档,添加新文档
-
方式二:增量修改,修改指定字段值
6.RestClient操作索引库
ES提供了各种不同语言的客户端。
这些客户端的本质就是组装DSL语句;
通过http请求发送给ES。
例如:JavaRestClient
7.RestClient操作文档
- 创建不同类型的请求对象
- 准备参数(如果需要)
- 发送请求
7.1.新增文档
7.2.查询文档
7.3.更新文档
7.4.删除文档
7.5.批量导入文档
elasticsearch搜索功能
1.DSL查询分类和基本语法
1.1.查询分类
1.2.查询的基本语法
查询三要素:查询类型、查询条件、条件值
1.3.全文检索查询
全文检索查询,会对用户输入的内容分词,常用于搜索框搜索。
1.4.精确查询
一般是查询keyword、数值、日期、boolean等类型字段。
所以一般不会被分词,常见的类型:
- term:根据词条值精确查找
- range:根据值的范围查询
1.5.地理查询
根据经纬度查询,常见的使用场景:
- 携程:搜索我附近的酒店
- 滴滴:搜索我附件的出租车
- 微信:搜索我附近的人
常见的类型:
-
geo_bounding_box:查询geo_point值落在某个矩形范围的所有文档
-
合适一定范围的所有信息,例如:地图找房
-
geo_distance:查询到指定中心点小于某个距离值的所有文档
附近的概念
1.6 复合(compound)查询
复合查询可以将其它简单查询组合起来,实现更复杂的搜索逻辑,例如:
function score
算分函数查询,可以控制文档相关性算分,控制文档排名。例如百度竞价
相关性算分
可以修改文档的相关性算分(query score),根据新得到的算分排序。
2.搜索结果的处理
2.1.排序
elasticsearch 支持对搜索结果的排序,默认根据相关度算分(_score)来排序。
可以排序的字段类型有:
- keyword类型
- 数值类型
- 地理坐标类型
- 日期类型
2.2.分页
elasticsearch 默认情况下只返回top10的数据。
如果需要更多数据就需要修改分页参数:
通过修改from、size参数来控制返回的分页结果:
深度分页问题:
ES是分布式的,所以会面临深度分页问题
深度分页解决方案:
- search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。推荐使用的方式。
- scroll:原理将排序数据形成快照,保存在内存。官方已不推荐使用
总结:
2.3.高亮
高亮:就是在搜索结果中把关键字突出显示。
原理:
- 将搜索结果中的关键字用标签标记出来
- 在页面中给标签添加css样式
语法:
注意:
高亮查询,默认情况下,ES搜索字段必须与高亮字段一致;
但是可通过require_field_match属性配置;
总结:
3.RestClient 查询文档
3.1.快速入门
实现的3步法:
- 准备request
- 准备DSL
- 发送请求
通过match_all来演示基本的API:
结果的解析:
总结:
3.2.全文检索查询
3.3.精确查询
3.4.复合查询
3.5.排序、分页、高亮
-
排序和分页
搜索结果的排序和分页是与query同级的参数:
高亮
高亮API包括请求DSL构建和结果解析2部分
DSL构建:
实现:但是结果并没有高亮
高亮结果解析:高亮需要单独解析