目录
一、什么是elasticsearch?
二、什么是kibana?
三、elasticsearch的优点
四、elasticsearch怎么实现查询的?
五、引入:正向索引、倒排索引
5.1 概念
5.2、优缺点:
六、es的概念
6.1、文档和字段
6.2、索引和映射
七、索引库操作
7.1、mapping映射属性
7.2、索引库操作
7.3、 文档操作
八、RestAPI(Java HighLevel Rest Client客户端API )
8.1 、引入依赖
8.2、RestClien操作t索引库
8.3、 RestClient操作文档
一、什么是elasticsearch?
它是一款非常强大的分布式搜索引擎 ,它可以帮助我们在大量的数据中快速的查询我们需要的内容,并且可以实现搜索、日志统计、分析、系统监控等功能 。
二、什么是kibana?
它是elasticsearch的一种可视化工具
三、elasticsearch的优点
- 支持分布式、可水平拓展
- 提供Restful接口,可被任何语言调用
四、elasticsearch怎么实现查询的?
创建倒排索引是对正向索引的一种特殊处理,流程如下:
-
将每一个文档的数据利用算法分词,得到一个个词条
-
创建表,每行数据包括词条、词条所在文档id、位置等信息
-
因为词条唯一性,可以给词条创建索引,例如hash表结构索引
五、引入:正向索引、倒排索引
5.1 概念
正向索引:如果根据一个表的id来查询,查询速度非常快。但是如果根据其他字段则,无法查看或 者查询效率变低。这时候可以采取倒排索引。
倒排索引:
-
文档(
Document
):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息 -
词条(
Term
):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条
总结:
-
正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程。
-
而倒排索引则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id获取文档。是根据词条找文档的过程
5.2、优缺点:
正向索引:
-
优点:
-
可以给多个字段创建索引
-
根据索引字段搜索、排序速度非常快
-
-
缺点:
-
根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。
-
倒排索引:
-
优点:
-
根据词条搜索、模糊搜索时,速度非常快
-
-
缺点:
-
只能给词条创建索引,而不是字段
-
无法根据字段做排序
-
----------------------------------------------接下来才是重点--------------------------------------------------------------------
六、es的概念
6.1、文档和字段
elasticsearch是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单息。
文档数据会被序列化为json格式后存储在elasticsearch中 。
而Json文档中往往包含很多的字段(Field),类似于数据库中的列。
6.2、索引和映射
索引(Index),就是相同类型的文档的集合。(我们可以把索引当做是数据库中的表 ) 。
数据库的表会有约束信息,用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有映射(mapping),是索引中文档的字段约束信息,类似表的结构约束。
七、索引库操作
7.1、mapping映射属性
mapping是对索引库中文档的约束,常见的mapping属性包括:
-
type:字段数据类型,常见的简单类型有:
-
字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
-
数值:long、integer、short、byte、double、float、
-
布尔:boolean
-
日期:date
-
对象:object
-
-
index:是否创建索引,默认为true
-
analyzer:使用哪种分词器
-
properties:该字段的子字段
7.2、索引库操作
-
创建索引库:PUT /索引库名
-
查询索引库:GET /索引库名
-
删除索引库:DELETE /索引库名
-
添加字段:PUT /索引库名/_mapping
# 创建索引库
PUT /索引库名称
{
"mappings": {
"properties": {
"字段名":{
"type": "text",
"analyzer": "ik_smart"
},
"字段名2":{
"type": "keyword",
"index": "false"
},
"字段名3":{
"properties": {
"子字段": {
"type": "keyword"
}
}
}
}
}
}
# 查询索引库
GET /索引库名称
# 修改索引库(一旦创建索引库,就无法修改,但是可以添加)
PUT /索引库名/_mapping
{
"properties": {
"新字段名":{
"type": "integer"
}
}
}
# 删除索引库
DELETE /索引库名
7.3、 文档操作
-
创建文档:POST /{索引库名}/_doc/文档id { json文档 }
-
查询文档:GET /{索引库名}/_doc/文档id
-
删除文档:DELETE /{索引库名}/_doc/文档id
-
修改文档:
-
全量修改:PUT /{索引库名}/_doc/文档id { json文档 }
-
增量修改:POST /{索引库名}/_update/文档id { "doc": {字段}}
-
# 添加文档
POST /索引库名/_doc/文档id
{
"字段1": "值1",
"字段2": "值2",
"字段3": {
"子属性1": "值3",
"子属性2": "值4"
}
}
# 查询文档
GET /索引库名称/_doc/id值
# 删除文档
DELETE /索引库名/_doc/id值
# 修改文档
# 全量修改(全量修改是覆盖原来的文档)
# 注意:如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。
PUT /索引库名/_doc/文档id值
{
"字段1": "值1",
"字段2": "值2"
}
# 增量修改(增量修改是只修改指定id匹配的文档中的部分字段)
POST /索引库名/_update/文档id值
{
"doc": {
"字段名": "新的值",
}
}
八、RestAPI(Java HighLevel Rest Client客户端API )
8.1 、引入依赖
在elasticsearch提供的API中,与elasticsearch一切交互都封装在一个名RestHighLevelClient的类中,必须先完成这个对象的初始化,建立与elasticsearch的连接。
1)引入es的RestHighLevelClient依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
2)因为SpringBoot默认的ES版本是7.6.2,所以我们需要覆盖默认的ES版本
<properties>
<java.version>1.8</java.version>
<elasticsearch.version>7.12.1</elasticsearch.version>
</properties>
3)初始化RestHighLevelClient:
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://IP:端口")
));
8.2、RestClien操作t索引库
功能:用来操作ES
JavaRestClient操作elasticsearch的流程基本类似。核心是client.indices()方法来获取索引库的操作对象。
索引库操作的基本步骤:
-
初始化RestHighLevelClient
-
创建XxxIndexRequest。XXX是Create、Get、Delete
-
准备DSL( Create时需要,其它是无参)
-
发送请求。调用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete
// 创建索引库
@Test
void createHotelIndex() throws IOException {
// 1.创建Request对象
CreateIndexRequest request = new CreateIndexRequest("hotel");
// 2.准备请求的参数:DSL语句
request.source(MAPPING_TEMPLATE, XContentType.JSON);
// 3.发送请求
client.indices().create(request, RequestOptions.DEFAULT);
}
// 删除索引库
@Test
void testDeleteHotelIndex() throws IOException {
// 1.创建Request对象
DeleteIndexRequest request = new DeleteIndexRequest("hotel");
// 2.发送请求
client.indices().delete(request, RequestOptions.DEFAULT);
}
// 判断索引库是否存在
@Test
void testExistsHotelIndex() throws IOException {
// 1.创建Request对象
GetIndexRequest request = new GetIndexRequest("hotel");
// 2.发送请求
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
// 3.输出
System.err.println(exists ? "索引库已经存在!" : "索引库不存在!");
}
8.3、 RestClient操作文档
文档操作的基本步骤:
-
初始化RestHighLevelClient
-
创建XxxRequest。XXX是Index、Get、Update、Delete、Bulk
-
准备参数(Index、Update、Bulk时需要)
-
发送请求。调用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete、bulk文章来源:https://www.toymoban.com/news/detail-418333.html
-
解析结果(Get时需要)文章来源地址https://www.toymoban.com/news/detail-418333.html
// 添加文档
@Test
void testAddDocument() throws IOException {
Hotel hotel = hotelService.getById(38812);
HotelDoc hotelDoc = new HotelDoc(hotel);
// 1、准备request对象
IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());
request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);
client.index(request,RequestOptions.DEFAULT);
}
// 查看文档
@Test
void testGetDocument() throws IOException {
GetRequest request = new GetRequest("hotel").id("38812");
GetResponse response = client.get(request, RequestOptions.DEFAULT);
String json = response.getSourceAsString();
JSONObject jsonObject = JSON.parseObject(json);
System.out.println(jsonObject);
}
// 修改文档
@Test
void testUpdateDocument() throws IOException {
UpdateRequest updateRequest = new UpdateRequest("hotel","38812");
updateRequest.doc(
"price","953"
);
client.update(updateRequest,RequestOptions.DEFAULT);
}
// 删除文档
@Test
void testDeleteDocument() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("hotel","38812");
client.delete(deleteRequest,RequestOptions.DEFAULT);
}
// 批量导入文档
@Test
void testBulkRequest() throws IOException {
BulkRequest bulkRequest = new BulkRequest();
List<Hotel> list = hotelService.list();
for (Hotel hotel : list) {
HotelDoc hotelDoc = new HotelDoc(hotel);
bulkRequest.add(new IndexRequest("hotel").id(hotelDoc.getId().toString()).source(JSON.toJSONString(hotelDoc),XContentType.JSON));
}
client.bulk(bulkRequest,RequestOptions.DEFAULT);
}
到了这里,关于ElasticSearch与Kibana基本概念和使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!