索引库基本操作
索引库基本操作ES 通过 Restful 请求操作索引库、文档,本文介绍如何使用 DSL 来操作索引库
创建索引库示例模版
12345678910111213141516171819202122232425PUT /索引库名称{ "mappings":{ "properties":{ "字段1":{ "type":"text", "analyzer":"ik_smart" }, "字段2":{ "type":"keyword", "index":"false" }, "字段3":{ "properties" ...
索引库-mapping
索引库-mapping写在前面的话:
在 Elasticsearch 6.x 及之前,每个索引中可以包含多个“类型”(类似于 SQL 中的表),通过类型区分不同文档结构。
从 Elasticsearch 7.x 开始,移除了类型的概念,所有文档在一个索引中共享相同的映射(mapping)。也就是说,不能再通过 type 区分不同文档,而是直接使用索引级别的映射。
Elasticsearch 8.x 彻底移除了类型字段,即 _type 字段完全不存在。
在 Elasticsearch 7.x 及以上版本中,索引结构的基础已经从原来的“类型(type)”转变为纯粹基于文档和字段(document and field)。
mapping 是对索引库中 document 的约束,本文介绍常见的mapping属性
常见的mapping属性
type(字段类型)
index(是否创建索引,默认true)
analyzer(分词器)
properties(该字段有哪些子字段)
type 类型详解核心数据类型文本类型 text文本类型默认会被分词,可以指定 index:"fal ...
IK分词器的扩展与停用词典
IK分词器的扩展与停用词典什么是扩展词典/停用词典可以通过编辑扩展词典和停用词典来改变分词规则
扩展词典:有些词并不是关键词,但是也希望被ES用来作为检索的关键词,可以将这些词加入扩展词典。
停用词典 有些词是关键词,但是出于业务场景不想使用这些关键词被检索到,可以将这些词放入停用词典。
如何添加扩展词典和停用词典?所在目录:
编辑 IKAnalyzer.cfg.xml 文件
1234567891011121314<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><properties> <comment>IK Analyzer 扩展配置</comment> <!--用户可以在这里配置自己的扩展字典 --> <entry key="ext_dict" ...
docker安装ES kibana ik
docker安装ES kibana ikStep 1. 创建 Docker 网络1docker network create elastic-network
Step 2. 创建Docker Compose 文件在一个目录下创建一个名为 docker-compose.yml 的文件,内容如下:
12345678910111213141516171819202122232425262728293031323334353637383940version: '3'services: elasticsearch: image: elasticsearch:7.17.0 container_name: elasticsearch environment: - discovery.type=single-node - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - cluster.name=docker-cluster - node.name=node-1 - ne ...
什么是ES
什么是ES了解ES
一款强大的开源搜索引擎
elasticsearch结合了kibana、Logstash、Beats,即elastic stack(ELK),ELK技术栈的核心是ES
广泛应用于搜索、日志分析、实时监控领域(数据可视化)
前身是Lucene,提供搜索引擎的API,记住这个人:Shay Banon
认识ES传统的数据库一般使用正向索引,ES使用倒排索引,倒排索引是term到document的索引结构(正向索引是document到term)
ducument可以理解成数据,term是数据的分词,ES面向文档(document)存储,文档以json序列化的格式存储在ES中
相同类型的json的集合(document的集合),作为索引(Index)
建立term到document的映射表,基于term来查询document编号;查询过程如图:
MySQL和ES各自的优势领域:
MySQL: 事务类型操作,数据安全性,一致性
ES:海量数据搜索、分析、计算
二者可以互补,如下图架构:
限流详解
限流(Rate Limiting)详解定义限流(Rate Limiting)是指在单位时间内限制某个操作的最大执行次数,以防止系统过载、资源枯竭或拒绝服务攻击(DDoS)。
通过限流,可以确保系统在高并发访问时仍能保持稳定性和高可用性。
使用场景限流在各种场景中都能发挥重要作用,主要包括但不限于以下几种:
API网关:限制客户端对后端服务的请求频率,防止恶意请求导致服务不可用。
用户操作:防止单个用户频繁操作,如频繁登录尝试、评论、点赞等。
分布式系统:在分布式系统中控制对某些共享资源的访问频率,防止资源竞争导致系统性能下降。
消息队列:控制消息的生产或消费速率,防止消息队列积压或系统过载。
如何使用限流限流的实现可以通过多种方式进行,常见的方法有以下几种:
客户端限流:在客户端对请求频率进行控制,防止过多请求发送到服务器。
服务器端限流:在服务器端对接收到的请求进行控制,常见的做法是在API网关或服务层实现限流逻辑。
中间件限流:使用第三方中间件或库实现限流,如Redis、Nginx等。
以下是一些具体的实现示例:
基于Redis的限流Redis是一个高性能的内存数据库,可以 ...
为什么需要不可变类?
为什么需要不可变类?不可变类一旦创建,其状态就不能被修改,这带来了多个方面的好处
包括:
线程安全性
简化代码
提高性能
…
不可变类不代表类内变量不可变,而是状态(字段值)不可变
线程安全性多线程环境中的安全性:由于不可变对象一旦创建就不能改变状态,它们天生是线程安全的。
多个线程可以安全地共享和访问同一个不可变对象,而不需要同步机制来避免并发修改的问题。
简化代码减少复杂性:不可变对象的状态不会改变,因此在处理它们时,不需要考虑对象状态的变化。这简化了代码,减少了错误的可能性。
安全性:不可变对象可以安全地传递给方法、存储在集合中或返回给调用者,而不需要担心它们会在其他地方被修改。
提高性能缓存:不可变对象可以被缓存和重用。一个典型的例子是字符串池(String Pool),其中相同的字符串字面量被缓存,以减少内存使用和提高性能。
哈希码缓存:由于不可变对象的状态不变,它们的哈希码也不会变化。因此,可以在创建对象时计算并缓存哈希码,以提高集合(如哈希表和哈希集)的性能。
易于维护和调试更容易理解和维护:由于不可变对象的状态一旦创建就不变,理解和维护这些对象的代码变得更加 ...
为什么Java不支持多继承
为什么Java不支持多继承第一,降低类关系复杂度
第二,避免菱形继承问题:A->B , A->C, B&C->D ,现在,D调用A的方法,B,C都有重写,产生冲突
接口与抽象类的区别
接口与抽象类的区别总览
特性
接口
抽象类
方法实现
只能包含抽象方法(Java 8 之后支持默认方法和静态方法)
可以包含抽象方法和具体方法
成员变量
只能包含常量(默认 public static final)
可以包含实例变量、静态变量和常量
多重继承
一个类可以实现多个接口
一个类只能继承一个抽象类
访问修饰符
方法默认是 public
方法可以是 public、protected 或 default
构造器
没有构造器
可以有构造器
适用场景
定义一组不相关类的共同行为
定义一组相关类的共同行为和属性
实现和继承
implements
extends
版本要求
Java 8 之前只能包含抽象方法
任意版本支持
区别
接口使用 interface ,抽象类使用 abstract
一个类可以实现多个接口,但只能继承一个抽象类
接口成员变量一定是public static final,抽象类成员变量没有约束
接口没有构造函数,抽象类可有可无
接口的方法一般是public abstract (Java8 后有default和stati ...
ForkJoinPool详解
ForkJoinPool详解是什么ForkJoinPool 是 Java 并发包(java.util.concurrent)中的一种特殊线程池,用于执行分治任务。
ForkJoinPool 使用了一种工作窃取(work-stealing)算法,允许线程动态获取其他线程队列中的任务,以最大化 CPU 利用率和任务处理效率。
使用场景ForkJoinPool 特别适合以下场景(CPU密集型):
递归分治算法:如快速排序、归并排序等,需要将问题分解成更小子问题的算法。
大规模数据处理:需要并行处理大数据集,如数组、集合的并行操作。
核心组件ForkJoinTask:这是 ForkJoinPool 中执行的任务的基本类型,有两个主要子类:
RecursiveTask:有返回结果的任务。
RecursiveAction:没有返回结果的任务。
工作窃取算法:每个工作线程都有自己的双端队列(deque),线程可以从自己的队列头部获取任务执行。当一个线程完成自己的任务时,它会从其他线程的队列尾部窃取任务,以减少空闲时间,提高并行性。
示例代码下面是一个使用 ForkJoinPool 计算 ...
