ElasticSearch01
- 1.ElasticSearch简介:
- 2.ELK:可以用来实现搜索、日志统计、分析、系统监控等功能(ELK)
- 3.正向索引:
- 4.倒排索引:(ElasticSearch:倒排索引 )
- 5.创建索引,必须是自增整数类型字段?
- 6.mysql与elasticsearch的概念对比:
- 7.mysql、mongDB和es的技术选型:
- 8.kibana是es的web页面,相当于可视化工具
- 9.文档和词条:
- 10.elasticeserch的存储结构:
- 11.分词索引都保存在哪里??
- 12.es和kibana通信需要创建网络
- 13.IK分词器包含两种模式:
- 14.es的数值类型和java一样,因为是基于java开发的。
- 15.mapping是对索引库中文档的约束,常见的mapping属性包括:
- 16.DSL命令:相当于sql
- 17.索引创建规则:
- 18.索引库mapping的修改:只能新增字段。
- 19.n个子字段,是n个索引。
- 20.全量修改:
- 21.子字段怎么增量修改?
- 22.全量简单,增量性能好。
- 23.文档操作有哪些?
- 24.小数用java计算会丢失精准度。所以都先乘以10的倍数,变成整数再计算。
- 25.地址是不分词的,而且不会用地址去搜索,所以不用创建索引。
- 26.只有文字需要分词嘛,数字类型不分词
- 27.特殊字段说明:
- 28.junit包:before和after.
- 29.location-mysql转es坐标点:
- 30.没有创建索引约束的化,也可以直接插入文档:
- 31.全量修改和新增的代码结构是一样的,只需要修改json数据就可以了。
- 32.java中不支持json。json中的冒号--java中用逗号代替。
- 33.BulkRequest批处理,解决创建连接的性能
- 34.文档操作的基本步骤:
1.ElasticSearch简介:
ElasticSearch之前也叫compass,相当于java语言开发的web工程。可以独立运行,实现分布式集群。
1)ElasticSearch:实际上是基于lucence的web工程。
2)lucence:是基于java的jar包,搜索引擎类库。
lucence的缺点:
不能跨语言。
要学大量api,学习成本高。
集成本地项目内,无法实现独立的分布式集群。
ElasticSearch的优点:
提供restful风格
支持分布式
跨语言
2.ELK:可以用来实现搜索、日志统计、分析、系统监控等功能(ELK)
elasticsearch为核心的技术栈,包括beats、Logstash、kibana、elasticsearch
3.正向索引:
- 基于文档id创建索引。查询词条时必须先找到文档,而后判断是否包含词条
4.倒排索引:(ElasticSearch:倒排索引 )
-
对文档内容分词,对词条创建索引,并记录词条所在文档的信息
-
查询时先根据词条查询到文档id,而后获取到文档
特点:存储比较慢,但是查的很快。
5.创建索引,必须是自增整数类型字段?
只要是唯一的,就可以做索引。
6.mysql与elasticsearch的概念对比:
MySQL | Elasticsearch | 说明 |
---|---|---|
Table | Index | 索引(index),就是文档的集合,类似数据库的表(table) |
Row | Document | 文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式 |
Column | Field | 字段(Field),就是JSON文档中的字段,类似数据库中的列(Column) |
Schema | Mapping | Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema) |
SQL | DSL | DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD |
7.mysql、mongDB和es的技术选型:
1)Mysql:擅长事务类型操作,可以确保数据的安全和一致性
2)Elasticsearch:擅长海量数据的搜索、分析、计算
mysql数据要同步到es中
存储用mysql,查询用elasticsearch,海量数据用mongDB
8.kibana是es的web页面,相当于可视化工具
9.文档和词条:
每一条数据就是一个文档,对文档中的内容分词,得到的词语就是词条
10.elasticeserch的存储结构:
文档:一条数据就是一个文档,es中是Json格式
- 字段:Json文档中的字段
- 索引:同类型文档的集合
映射:索引中文档的约束,比如字段名称、类型
11.分词索引都保存在哪里??
ES的倒排索引结构本质是一些文件,最终是存在磁盘的;
12.es和kibana通信需要创建网络
在linux中
docker network create es-net
13.IK分词器包含两种模式:
ik_smart
:最少切分ik_max_word
:最细切分
14.es的数值类型和java一样,因为是基于java开发的。
15.mapping是对索引库中文档的约束,常见的mapping属性包括:
- type:字段数据类型,常见的简单类型有:
- 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
- 数值:long、integer、short、byte、double、float、
- 布尔:boolean
- 日期:date
- 对象:object
- index:是否创建索引,默认为true
- analyzer:使用哪种分词器
- properties:该字段的子字段
16.DSL命令:相当于sql
是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD
17.索引创建规则:
需要搜索的字段才创建索引。
18.索引库mapping的修改:只能新增字段。
索引库一旦创建就无法修改mapping,但是可以新增字段。不会对倒排索引产生影响。
修改字段会对倒排索引有影响。
19.n个子字段,是n个索引。
20.全量修改:
全量修改是覆盖原来的文档,其本质是:
- 根据指定的id删除文档
- 新增一个相同id的文档
注意:如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。
21.子字段怎么增量修改?
需要把所有的子字段:写出来。
注意:不能只写一部分,会判定为新字段的。
22.全量简单,增量性能好。
23.文档操作有哪些?
- 创建文档:POST /索引库名/_doc/文档id { json文档 }
- 查询文档:GET /索引库名/_doc/文档id
- 删除文档:DELETE /索引库名/_doc/文档id
- 修改文档:
- 全量修改:PUT /索引库名/_doc/文档id { json文档 }
- 增量修改:POST /索引库名/_update/文档id { “doc”: {字段}}
24.小数用java计算会丢失精准度。所以都先乘以10的倍数,变成整数再计算。
25.地址是不分词的,而且不会用地址去搜索,所以不用创建索引。
26.只有文字需要分词嘛,数字类型不分词
27.特殊字段说明:
1)location:地理坐标,里面包含精度、纬度
2)all:一个组合字段,其目的是将多字段的值 利用copy_to合并,提供给用户搜索
28.junit包:before和after.
29.location-mysql转es坐标点:
先维度后精度。经纬度。
this.location = hotel.getLatitude() + ", " + hotel.getLongitude();
30.没有创建索引约束的化,也可以直接插入文档:
自动生成文档约束,但是生成的文档约束并不是很符合业务需要,所以还是要先创建索引约束。
31.全量修改和新增的代码结构是一样的,只需要修改json数据就可以了。
32.java中不支持json。json中的冒号–java中用逗号代替。
request.doc(
"price", "999",
"starName", "四钻"
);
33.BulkRequest批处理,解决创建连接的性能
多个普通的CRUD请求组合在一起发送
@Test
public void testBulkRequest() throws Exception {
// 查询所有酒店数据
List<Hotel> hotelList = hotelService.list();
// 1.创建request
BulkRequest request = new BulkRequest();
// 2.准备DSL
for (Hotel hotel : hotelList) {
// 2-1 转为文档类型
HotelDoc hotelDoc = new HotelDoc(hotel);
// 2-2 转为json
String json = JSON.toJSONString(hotelDoc);
// 2-3 新增document
request.add(new IndexRequest("hotel")
.id(hotelDoc.getId().toString())
.source(json, XContentType.JSON));
}
// 3.发送请求
client.bulk(request, RequestOptions.DEFAULT);
}
34.文档操作的基本步骤:
-
初始化
RestHighLevelClient
-
创建
XxxRequest
。XXX是Index、Get、Update、Delete、Bulk -
准备参数(Index、Update、Bulk时需要)
-
发送请求。调用
RestHighLevelClient..xxx()
方法,xxx是index、get、update、delete、bulk -
解析结果(Get时需要)
实例:
新增文档 @Test public void testAddDocument() throws Exception { // 1-1 根据id查询酒店数据 Hotel hotel = hotelService.getById(61083L); // 1-2 转为文档实体类型 HotelDoc hotelDoc = new HotelDoc(hotel); // 1-3 将hotelDoc转为json String json = JSON.toJSONString(hotelDoc); // 2-1 创建request IndexRequest request = new IndexRequest("hote").id(hotelDoc.getId().toString()); // 2-2 准备DSL(json文档) request.source(json, XContentType.JSON); // 3-3 发送请求 client.index(request, RequestOptions.DEFAULT); }