(ElasticSearch01)day79javaEE基础查漏补缺

本文深入探讨了ElasticSearch的基础概念、ELK堆栈的应用、索引结构、MySQL与Elasticsearch对比、技术选型建议,以及文档操作和索引管理的实战技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ElasticSearch01

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的概念对比:

MySQLElasticsearch说明
TableIndex索引(index),就是文档的集合,类似数据库的表(table)
RowDocument文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式
ColumnField字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)
SchemaMappingMapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)
SQLDSLDSL是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:地理坐标,里面包含精度、纬度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CvQ2nnk6-1648991017997)(问题2.assets/1648973717100.png)]

2)all:一个组合字段,其目的是将多字段的值 利用copy_to合并,提供给用户搜索

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aXsYBrpu-1648991017998)(问题2.assets/1648973728660.png)]

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);
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值