ElasticSearch上

安装ElasticSearch

  • Lucene:Java语言的搜索引擎类库,易扩展;高性能(基于倒排索引)
  • Elasticsearch基于Lucene,支持分布式,可水平扩展;提供Restful接口,可被任何语言调用
  • Elasticsearch结合kibana、logstash、Beats,是一套完整的技术栈,被叫做ELK。
    在这里插入图片描述

安装ElasticSearch

docker run -d \
  --name es \
  -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
  -e "discovery.type=single-node" \
  -v es-data:/usr/share/elasticsearch/data \
  -v es-plugins:/usr/share/elasticsearch/plugins \
  --privileged \
  --network hm-net \
  -p 9200:9200 \
  -p 9300:9300 \
  --restart=always \
  elasticsearch:7.12.1
  • -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" :配置JVM的最大最小内存
  • -e "discovery.type=single-node":配置运行模式(集群模式、单点模式)
  • -v es-data:/usr/share/elasticsearch/data:es的数据存储目录
  • -v es-plugins:/usr/share/elasticsearch/plugins:es的插件目录
  • -p 9200:9200:访问的http端口
  • -p 9300:9300:集群间通信端口

查看es的日志: docker logs -f es
在这里插入图片描述
安装成功后,在浏览器输入:http://192.168.140.101:9200/,看到响应即安装成功。在这里插入图片描述

安装Kibana

Kibana是个图形界面,帮助我们连接es

docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=hm-net \
-p 5601:5601  \
--restart=always \
kibana:7.12.1
  • -e ELASTICSEARCH_HOSTS=http://es:9200 \:因为kibana和es在同一个网络下,所以可以通过容器名直接连接es

查看kibana的日志: docker logs -f kibana在这里插入图片描述
安装成功后,在浏览器输入:http://192.168.140.101:5601/,看到响应即安装成功。
在这里插入图片描述
可以利用kibana中Dev Tools控制台向es发送http请求

倒排索引

MySQL采用的是正向索引:
在这里插入图片描述

查询词条时需要逐行遍历文档,再判断文档中是否包含了词条

Elasticsearch采用倒排索引:

  • 文档(document):每条数据就是一个文档
  • 词条(term):文档按照语义分成的词语
    在这里插入图片描述

用户搜索的时候,先对用户搜索的数据进行分词,将分词后的词条放到词条列表中得到文档id,根据文档id去文档列表中查询。虽然有两次查询,但是每次查询都是有索引,搜索速度快。

IK分词器

中文分词往往需要根据语义,比较复杂,这就需要用到中文分词器,例如:IK分词器
下载地址:IK分词器

安装IK分词器

只需要把IK分词器下载后放到es的插件目录重启es即可生效。
在这里插入图片描述

测试IK分词器是否安装成功

ik_smart

智能切分,粗粒度

POST /_analyze
{
  "analyzer": "ik_smart",
  "text": "今天天气真好"
}

在这里插入图片描述

ik_max_word

最细切分,细粒度IK分词器

POST /_analyze
{
  "analyzer": "ik_max_word",
  "text": "今天天气真好"
}

在这里插入图片描述

自定义词典

可以在ik插件的config目录下的IKAnalyzer.cfg.xml文件配置扩展词典停止词典
在这里插入图片描述

ElasticSearch中基础概念

在这里插入图片描述

索引库操作

索引库相当于MySQL里的表,Mapping相当于对表字段的约束

Mapping映射属性

mapping是对索引库中文档的约束。

  1. type:字段数据类型
    • 字符串:text(可分词文本)、keyword(精确值,不能分词,例如:品牌、国家、ip地址)
    • 数值:long、integer、short、byte、double、float
    • 布尔:boolean
    • 日期:date(es自己把日期对象做了序列化)
    • 对象:object
  2. index:是否创建索引,默认为true
    • true:es就会给这个字段创建倒排索引,就可以根据这个字段进行搜索或排序
  3. analyzer:使用哪种分词器(ik_smart、ik_max_word),只有字段类型是text才需要指定分词器
  4. properties:该字段的子字段

在es中,不需要管是否是数组,就算是数组,也只要指定元素的类型即可

索引库的CRUD

es中提供的API都是Restful的接口,遵循Restful的基本规范:
在这里插入图片描述

创建索引库

PUT /索引库名称
{
  "mappings": {
    "properties": {
      "字段名":{
        "type": "text", // 可分词
        "analyzer": "ik_smart"
      },
      "字段名2":{
        "type": "keyword", // 不可分词
        "index": "false"
      },
      "字段名3":{
        "properties": {
          "子字段": {
            "type": "keyword"
          }
        }
      },
      // ...略
    }
  }
}

【例】:

# 创建索引库
PUT /people 
{
  "mappings": {
    "properties": {
      "info": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "age": {
        "type": "byte"
      },
      "email": {
        "type": "keyword",
        "index": "false"
      },
      "name": {
        "type": "object",
        "properties": {
          "firstName":{
            "type": "keyword"
          },
          "lastName": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

在这里插入图片描述

修改索引库

PUT /索引库名/_mapping
{
  "properties": {
    "新字段名":{
      "type": "integer"
    }
  }
}

【例】:

# 修改索引库,新增一个sex字段
PUT /people/_mapping 
{
  "properties": {
    "sex": {
      "type": "boolean"
    }
  }
}

【注】:es中是不允许对已有索引库的字段进行修改,但是允许添加新的字段
【原因】:假设已经在es中创建大量的倒排索引,做了大量的分词,如果此时需要修改索引库,那么前期做的所有分词都作废还要重新建立倒排索引,对于整个数据库的影响很大。

查询索引库

# 查询索引库
GET /索引库名

删除索引库

# 删除索引库
DELETE /索引库名

文档操作

文档的CRUD

新增文档

POST /索引库名/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    "字段3": {
        "子属性1": "值3",
        "子属性2": "值4"
    },
}

【例】:

POST /people/_doc/1
{
    "info": "程序员",
    "email": "xiaolin0333@qq.com",
    "name": {
        "firstName": "林",
        "lastName": "三"
    }
}

新增文档的时候最好指定文档id,es会根据文档id创建索引,如果不指定id,es会随机生成id,这样将来操作文档就会很不方便

修改文档

1. 全量修改

删除旧文档,添加新文档

PUT /{索引库名}/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    // ... 文档的所有字段都要写
}

注:如果想要修改一个文档id不存在的文档,删除文档的时候,文档不存在,会直接新增一条文档
因此PUT请求具备了新增修改两种功能

  • 新增:文档id不存在
  • 修改:文档id存在
2. 增量修改

修改部分字段值

POST /{索引库名}/_update/文档id
{
    "doc": {
         "字段名": "新的值",
    }
}

查询文档

# 查询文档
GET /索引库名/_doc/文档id

在这里插入图片描述

删除文档

# 删除文档
DELETE /索引库名/_doc/文档id

批量处理

es中允许通过一次请求中携带多次文档操作。

POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } } // 新增(索引库名、id)
{ "field1" : "value1" } // 新增的文档信息

{ "delete" : { "_index" : "test", "_id" : "2" } } // 删除(索引库名、id)

{ "update" : {"_id" : "1", "_index" : "test"} } // 更新(索引库名、id)
{ "doc" : {"field2" : "value2"} } // 更新的文档信息(增量修改)

写的时候不能换行,只能在一行写,否则会报错

【例1】:批量新增

POST /_bulk 
  {"index": {"_index": "people","_id": "2"}}
  {"info": "这是人", "email": "xiaolin0333@qq.com", "name": {"firstName": "林", "lastName": "三"}}
  {"index": {"_index": "people","_id": "3"}}
  {"info": "这是狗", "email": "cmb@qq.com", "name": {"firstName": "柴", "lastName": "犬"}}

【例2】:批量删除

POST /_bulk 
  {"delete": {"_index": "people","_id": "2"}}
  {"delete": {"_index": "people","_id": "3"}}

JavaRestClient

客户端初始化

  1. 引入es的RestHighLevelClient的依赖:
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
  1. 因为SpringBoot默认ES的版本是7.17.0,所以需要覆盖默认的ES版本:
  <properties>
      <maven.compiler.source>11</maven.compiler.source>
      <maven.compiler.target>11</maven.compiler.target>
      <elasticsearch.version>7.12.1</elasticsearch.version>
  </properties>
  1. 初始化RestHighLevelClient(这里暂时先用单元测试为例)
public class ElasticTest {
    private RestHighLevelClient client;
    @Test
    void testConnection() {
        System.out.println("client = " + client);
    }
    @BeforeEach // 初始化方法:在单元测试执行前
    void setUp() {
        client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.140.101:9200")
        ));
    }
    @AfterEach // 销毁方法:在单元测试执行后
    void tearDown() throws IOException {
        if(client != null) {
            client.close();
        }
    }
}

商品表Mapping映射

【业务分析】:
在这里插入图片描述
在这里插入图片描述
【在控制台创建Mapping映射】:

# 商品索引库
PUT /hmall
{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "name": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "price": {
        "type": "integer"
      },
      "image": {
        "type": "keyword",
        "index": false
      },
      "category": {
        "type": "keyword"
      },
      "brand": {
        "type": "keyword"
      },
      "sold": {
        "type": "integer"
      },
      "commentCount": {
        "type": "integer",
        "index": false
      },
      "isAD": {
        "type": "boolean"
      },
      "updateTime": {
        "type": "date"
      }
    }
  }
}

索引库操作

  1. 创建XxxIndexRequest。Xxx指:Create、Get、Delete
  2. 准备请求参数(Create需要)
  3. 发送请求。调用client.indices.xxx()方法,xxx指:create、get、exists、delete

创建索引库

创建索引库的JavaAPI和Restful接口API对比:

@Test
void testCreateIndex() throws IOException {
    // 1. 准备Request对象
    CreateIndexRequest request = new CreateIndexRequest("items");
    // 2. 准备请求参数
    request.source(MAPPING_TEMPLATE, XContentType.JSON); // MAPPING_TEMPLATE就是前面在控制台写的那段
    // 3. 发送请求
    client.indices().create(request, RequestOptions.DEFAULT);
}

在这里插入图片描述

查询索引库

@Test
void testGetIndex() throws IOException {
    // 1. 准备Request对象
    GetIndexRequest request = new GetIndexRequest("items");
    // 2. 发送请求
    GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);// 查询索引库(索引库不存在报错)
    boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);// 判断索引库是否存在(索引库不存在返回false)
}

删除索引库

@Test
void testDeleteIndex() throws IOException {
     // 1. 准备Request对象
     DeleteIndexRequest request = new DeleteIndexRequest("items");
     // 2. 发送请求
     client.indices().delete(request, RequestOptions.DEFAULT);
 }

文档操作

  1. 初始化RestHighLevelClient
  2. 创建XxxRequest。Xxx指:Index、Get、Update、Delete
  3. 准备参数(Index和Update需要)
  4. 请求参数。调用xxx()方法,xxx是index、get、update、delete
  5. 解析结果(Get需要)

新增文档

新增文档的JavaAPI和Restful接口API对比:
在这里插入图片描述

@Test
void testIndexDoc() throws IOException {
    // 准备文档数据
    Item item = itemService.getById(2018833);
    ItemDoc itemDoc = BeanUtil.copyProperties(item, ItemDoc.class); // 文档数据对象
    String jsonStr = JSONUtil.toJsonStr(itemDoc); // JSON
    // 1. 准备Request
    IndexRequest request = new IndexRequest("items").id(itemDoc.getId());// 索引库名、文档id
    // 2. 准备JSON文档
    request.source(jsonStr, XContentType.JSON);
    // 3. 发送请求
    client.index(request, RequestOptions.DEFAULT);
}

修改文档

全量修改

全量修改相当于新增,就是新增的时候文档id已经存在

局部修改

在这里插入图片描述

@Test
void testUpdateDoc() throws IOException {
    // 1. 准备Request
    UpdateRequest request = new UpdateRequest("items", "2018833"); // 索引库名、文档id
    // 2. 准备请求参数
    request.doc(
            "price", 25600,
            "stock", 9999
    );
    // 3. 发送请求
    client.update(request, RequestOptions.DEFAULT);
}

查询文档

查询文档主要是拿到_source部分
在这里插入图片描述

@Test
void testGetDoc() throws IOException {
    // 1. 准备Request
    GetRequest request = new GetRequest("items", "2018833"); // 索引库名、文档id
    // 2. 发送请求
    GetResponse response = client.get(request, RequestOptions.DEFAULT);
    String json = response.getSourceAsString();
    ItemDoc doc = JSONUtil.toBean(json, ItemDoc.class);
    System.out.println(doc);
}

删除文档

@Test
void testDeleteDoc() throws IOException {
    // 1. 准备Request
    DeleteRequest request = new DeleteRequest("items", "2018833"); // 索引库名、文档id
    // 2. 发送请求
    client.delete(request, RequestOptions.DEFAULT);
}

批处理

构建请求时会用到BulkRequest来封装普通的CRUD请求:
在这里插入图片描述
【案例】:往索引库里添加所有上架的商品

@Test
void testBulkDoc() throws IOException {
    int pageNo = 1, pageSize = 500;
    while(true) {
        // 0. 准备文档数据
        Page<Item> page = itemService.lambdaQuery()
                .eq(Item::getStatus, 1) // 上架商品
                .page(Page.of(pageNo, pageSize));
        List<Item> records = page.getRecords();
        if(records == null || records.isEmpty()) {
            return;
        }
        // 1. 准备Request
        BulkRequest request = new BulkRequest();
        // 2. 准备数据-批量新增
        for(Item item : records) {
            ItemDoc itemDoc = BeanUtil.copyProperties(item, ItemDoc.class);
            request.add(new IndexRequest("items").id(item.getId().toString()).source(JSONUtil.toJsonStr(itemDoc), XContentType.JSON));
        }
        // 3. 发送请求
        client.bulk(request, RequestOptions.DEFAULT);
        pageNo++;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/955684.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GitLab:添加SSH密钥之前,您不能通过SSH来拉取或推送项目代码

1、查看服务器是否配置过 [rootkingbal-ecs-7612 ~]# cd .ssh/ [rootkingbal-ecs-7612 .ssh]# ls authorized_keys id_ed25519 id_ed25519.pub id_rsa id_rsa.pub2、创建密钥 $ ssh-keygen -t rsa -C kingbalkingbal.com # -C 后写你的邮箱 一路回车 3、复制密钥 [rootk…

《目标检测数据集下载地址》

一、引言 在计算机视觉的广袤领域中&#xff0c;目标检测宛如一颗璀璨的明星&#xff0c;占据着举足轻重的地位。它宛如赋予计算机一双锐利的 “眼睛”&#xff0c;使其能够精准识别图像或视频中的各类目标&#xff0c;并确定其位置&#xff0c;以边界框的形式清晰呈现。这项技…

Kibana 控制台中提供语义、向量和混合搜索

作者&#xff1a;来自 Elastic Mark_Laney 想要将常规 Elasticsearch 查询与新的 AI 搜索功能结合起来吗&#xff1f;那么&#xff0c;你不需要连接到某个第三方的大型语言模型&#xff08;LLM&#xff09;吗&#xff1f;不。你可以使用 Elastic 的 ELSER 模型来改进现有搜索&a…

Golang Gin系列-3:Gin Framework的项目结构

在Gin教程的第3篇&#xff0c;我们将讨论如何设置你的项目。这不仅仅是把文件扔得到处都是&#xff0c;而是要对所有东西的位置做出明智的选择。相信我&#xff0c;这些东西很重要。如果你做得对&#xff0c;你的项目会更容易处理。当你以后不再为了找东西或添加新功能而绞尽脑…

程序设计:排版、检验报告的上下标解决几种办法

【啰嗦两句】 本文重点在于提供几个针对排版文档、各种检验报告系统等程序设计时&#xff0c;遇到的上下标录入、绘制展示等问题的应对办法&#xff0c;但是准确地说&#xff0c;并没有非常优秀的方案。 【上下标难题】 一般的行业或许对上下标并没有严格要求&#xff0c;多数…

TCP 重传演进:TCP RACK Timer 能替代 RTO 吗

本文的建议适用于想改变 TCP 行为的新协议设计&#xff0c;还是那句话&#xff0c;不要抄 TCP 做 yet another TCP。 RTO 一直是 TCP 传输过程所要尽量避免的&#xff0c;因为它会将状态带入 Loss 进而 Go-Back-N&#xff0c;这是一个昂贵的操作。But 在 Fast-Retransmit 被引…

PCL 新增自定义点类型【2025最新版】

目录 一、自定义点类型1、前言2、定义方法3、代码示例二、合并现有类型三、点云按时间渲染1、CloudCompare渲染2、PCL渲染博客长期更新,本文最近更新时间为:2025年1月18日。 一、自定义点类型 1、前言 PCL库自身定义了很多点云类型,但是在使用的时候时如果要使用自己定义的…

Python操作Excel——openpyxl使用笔记(5)

5 其他操作 5.1 合并单元格 有些Excel表格存在合并多个单元格的情况&#xff0c;此时可以使用工作表的merge_cells函数&#xff0c;例如合并第1~2行和1~2列&#xff1a; import openpyxl from openpyxl.comments import Comment wb openpyxl.load_workbook(./test.xlsx) w…

Linux简介和环境搭建

Linux 介绍和环境搭建 1、发行版本 Linux 操作系统有多个主流发行版本&#xff0c;每个版本根据不同的目标、特点和使用场景为用户提供了不同的功能和体验。 Ubuntu • 特点&#xff1a;Ubuntu 是最为人熟知的 Linux 发行版之一&#xff0c;强调易用性和用户友好性&#xff…

LabVIEW时域近场天线测试

随着通信技术的飞速发展&#xff0c;特别是在5G及未来通信技术中&#xff0c;天线性能的测试需求日益增加。对于短脉冲天线和宽带天线的时域特性测试&#xff0c;传统的频域测试方法已无法满足其需求。时域测试方法在这些应用中具有明显优势&#xff0c;可以提供更快速和精准的…

SQL Server查询计划操作符——查询计划相关操作符(4)

7.3. 查询计划相关操作符 28)Declare:该操作符在查询计划中分配一个本地变量。该操作符是一个语言元素。该操作符具体如图7.2-28所示。 图 7.2-28 查询计划操作符Declare示例 29)Delete:该操作符从一个对象中删除满足其参数列中可选谓词的数据行。该操作符具体如图7.2-29…

复用类(3):在组合与继承之间选择、protected关键字、向上转型

1 在组合与继承之间选择 组合和继承都允许在新的类中放置子对象&#xff0c;组合是显式地这样做&#xff0c;而继承则是隐式地做。你或许想知道二者之间的区别何在&#xff0c;以及怎样在二者之间做出选择。 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形。…

Java-数据结构-二叉树习题(1)

对于二叉树的学习&#xff0c;主要的还是得多多练习~毕竟二叉树属于新的知识&#xff0c;并且也并不是线性结构&#xff0c;再加上经常使用递归的方法解决二叉树的问题&#xff0c;所以代码的具体流程还是无法看到的&#xff0c;只能通过画图想象&#xff0c;所以还是必须多加练…

彩色图像面积计算一般方法及MATLAB实现

一、引言 在数字图像处理中&#xff0c;经常需要获取感兴趣区域的面积属性&#xff0c;下面给出图像处理的一般步骤。 1.读入的彩色图像 2.将彩色图像转化为灰度图像 3.灰度图像转化为二值图像 4.区域标记 5.对每个区域的面积进行计算和显示 二、程序代码 %面积计算 cle…

计算机网络 (41)文件传送协议

前言 一、文件传送协议&#xff08;FTP&#xff09; 概述&#xff1a; FTP&#xff08;File Transfer Protocol&#xff09;是互联网上使用得最广泛的文件传送协议。FTP提供交互式的访问&#xff0c;允许客户指明文件的类型与格式&#xff08;如指明是否使用ASCII码&#xff0…

vscode的安装与使用

下载 地址&#xff1a;https://code.visualstudio.com/ 安装 修改安装路径&#xff08;不要有中文&#xff09; 点击下一步&#xff0c;创建桌面快捷方式&#xff0c;等待安装 安装中文插件 可以根据自己的需要安装python和Jupyter插件

用Cursor生成一个企业官网前端页面(生成腾讯、阿里官网静态页面)

用Cursor生成一个企业官网前端页面 第一版&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

简要认识Web技术三剑客:HTMLCSSJavaScript

目录 一、web标准二、什么是HTML三、什么是CSS四、什么是JavaScript 黑马JAVAWeb飞书在线讲义地址&#xff1a; https://heuqqdmbyk.feishu.cn/wiki/LYVswfK4eigRIhkW0pvcqgH9nWd 一、web标准 Web标准也称网页标准&#xff0c;由一系列的标准组成&#xff0c;大部分由W3C&…

python(25) : 含有大模型生成的公式的文本渲染成图片并生成word文档(支持flask接口调用)

公式样例 渲染前 \[ \sqrt{1904.615384} \approx 43.64 \] 渲染后 安装依赖 pip install matplotlib -i https://mirrors.aliyun.com/pypi/simple/ requestspip install sympy -i https://mirrors.aliyun.com/pypi/simple/ requestspip install python-docx -i https…

2024CVPR《HomoFormer》

这篇论文提出了一种名为HomoFormer的新型Transformer模型,用于图像阴影去除。论文的主要贡献和创新点如下: 1. 研究背景与动机 阴影去除的挑战:阴影在自然场景图像中普遍存在,影响图像质量并限制后续计算机视觉任务的性能。阴影的空间分布不均匀且模式多样,导致传统的卷积…