Elesticesearch

news2024/11/27 4:36:03

1. 概述

应用场景:
给你一个巨大的文档数据,文档中存储着许多非结构化的数据,如下:

{“id” : “1”, “name” : “佛山张学友”, “age” : “15”},
{“name” : “广州周润发”, “height” : “182”},
…中间有10000万行…
{“style” : “music”, “name” : “深圳薛之谦”},
{“name” : “东莞赵丽颖”}

找出name的属性值为 “深圳薛之谦” 的数据。

方案一:解析文档数据,按顺序查找第一行数据、第二行数据 … 第n-1行数据(此时找到name属性值为 “深圳薛之谦” 的数据,提取)、第n行数据。
方案二:为name属性建立索引,然后通过name索引找到属性值为 “深圳薛之谦” 的name数据列,然后提取所有相关的数据;

方案一,在少量数据占据极大的优势,因为不用维护索引表,同时查找效率也较高;
方案二,在大量数据占据特大的优势,因为可以通过索引快速找到相关的列。

而方案二的这种思想就是Elesticesearch的设计理念。

同时,Elesticesearch还引入中文分词插件。他会对搜索词进行分词,然后再进行查找(跟我们的搜索引擎类似,对搜索关键词进行分词后再查找。)


2. Elesticesearch VS MySQL

Elesticesearch做的更多的是在大数据中快速的检索出与搜索词相关的数据; MySQL更多的是存储少量数据并操作,在大量的数据并不能发挥出很大的查询性能。

例如:
在百亿数据中查找包含 “深圳薛之谦” 的数据,

  1. MySQL有强大的索引功能,但是还是需要在小时的时间成本上,才能搜索相关的数据出来;
  2. Elesticesearch可以在毫秒级别响应,同时可以根据综合评分,搜索出其他相关的数据,例如深圳薛之谦的住处、行业等数据(可以类比搜索引擎)。

3. 安装

  1. ElasticSearch
    下载地址:https://www.elastic.co/cn/

  2. ElasticSearch连接可视化界面
    下载地址:https://github.com/mobz/elasticsearch-head.git(npm install+npm run start)
    在这里插入图片描述
    连接会出现跨域问题(后端9200端口,前端9100端口),修改ElasticSearch的config-elasticsearch.yml文件,添加跨域请求

http:
  cors:
    enabled: true
    allow-origin: "*"

连接成功!
在这里插入图片描述

  1. Kibana
    下载地址:https://www.elastic.co/cn/kibana/
    在这里插入图片描述
    在这里插入图片描述
    Kibana汉化(config-kibana.yml):
    在这里插入图片描述
  2. ik分词器
    下载地址:https://github.com/medcl/elasticsearch-analysis-ik
    下载后放到ElasticSearch的插件中去
    在这里插入图片描述
    利用kibana对输入进行分词操作:
    在这里插入图片描述

所有软件都放在微信公众号上:可乐大数据
发送:ElasticSearch

3. ES的一些名词

数据库ES
数据库索引
types
documents
字段fields

物理设计:
将索引切成多个文件,然后存储在不同的ElasticSearch服务器上(DB:将数据库划分成多个表)

倒排索引:
类比搜索引擎,如果查找 “李可乐玩ElasticSearch” 应该怎么在百亿数据中对应关键句子呢?

正序索引:将输入进行分词 ==> “李可乐”、“玩”、“ElasticSearch”。然后到相关文档(document)查找包含这些词,然后返回对应的句子即可。
逆序索引:将字典统计出来,字典的key就是单词,value就是文档id,如下图。

key:李可乐
value:文档1、文档2
key:玩
value:文档1
key:ElasticSearch
value:文档3、文档4

4. 常用命令

methodurl地址描述
PUTlocalhost:9200/索引名称/类型名称/文档id创建文档(指定文档id)
POSTlocalhost:9200/索引名称/类型名称创建文档(随机文档id)
POSTlocalhost:9200/索引名称/类型名称/文档id/_update修改文档
DELETElocahost:9200/索引名称/类型名称/文档id删除文档,通过文档id
GETlocalhost:9200/索引名称/类型名称/文档id查询文档,通过文档id
POSTlocalhost:9200/索引名称/类型名称/_search查询所有数据
# 插入数据
PUT /test_db/user/1
{
  "name" : "李可乐",
  "age" : 14
}

PUT /test_db/user/2
{
  "name" : "张三"
}

PUT /test_db/user/3
{
  "name" : "李四",
  "age" : 15
}


PUT /test_db/user/4
{
  "name" : "王五"
}


PUT /test_db/user/5
{
  "name" : "赵六"
}




# 查询所有
GET /test_db/user/_search

# 查询 + 条件(模糊查询,top-k返回)
GET /test_db/user/_search?q=name:李可乐

# 多条件查询
GET /test_db/user/_search
{
  "query": {
    "match": {
      "name": "李"
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 1
}

# 查询单个
GET /test_db/user/1


# 更新
POST /test_db/user/1/_update
{
  "doc" : {
    "name" : "李可乐"
  }
}

5. SpringBoot集成ES

1. 导入maven依赖
<dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>
        
    </dependencies>
  1. ES连接配置类
@Configuration
public class ElasticSearchClientConfig {

    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("127.0.0.1", 9200, "http")
                )
        );
        return client;
    }
}
  1. 一些相关的CRUD
@SpringBootTest(classes = TestApp.class)
public class ESApp {

    @Autowired
    private RestHighLevelClient client;


    /**
     * 索引操作
     * @throws Exception
     */

    @Test
    public void createIndex() throws Exception{
        IndicesClient indicesClient = client.indices();
        CreateIndexRequest request = new CreateIndexRequest("cola_index_1");
        CreateIndexResponse createIndexResponse = indicesClient.create(request, RequestOptions.DEFAULT);
        System.out.println(createIndexResponse.toString());
    }

    @Test
    public void existIndex() throws Exception{
        GetIndexRequest getIndexRequest = new GetIndexRequest("cola_index_1");
        boolean exists = client.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
        System.out.println(exists);
    }

    @Test
    public void deleteIndex() throws Exception{
        DeleteIndexRequest request = new DeleteIndexRequest("cola_index_1");
        AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
        System.out.println(response.isAcknowledged());
    }


    /**
     * 文档操作
     * @throws Exception
     */

    @Test
    public void addDocument() throws Exception{
        User user = new User("1", "张三");
        IndexRequest request = new IndexRequest("cola_index_1");

        // cola_index_1/_doc/1
        request.id("1");

        request.source(JSON.toJSONString(user), XContentType.JSON);

        IndexResponse response = client.index(request, RequestOptions.DEFAULT);

        System.out.println(response.toString());

    }


    @Test
    public void updateDocument() throws Exception{
        User user = new User("1", "小张三");

        UpdateRequest request = new UpdateRequest("cola_index_1", "1");

        UpdateRequest updateRequest = request.doc(JSON.toJSONString(user), XContentType.JSON);

        UpdateResponse response = client.update(updateRequest, RequestOptions.DEFAULT);

        System.out.println(response.toString());

    }


    @Test
    public void deleteDocument() throws Exception{

        DeleteRequest request = new DeleteRequest("cola_index_1", "1");

        DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);

        System.out.println(response.toString());

    }


    @Test
    public void getDocument() throws Exception{

        SearchRequest request = new SearchRequest("cola_index_1");

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ABAP 二分法查找与SORT排序

需求场景 需要对内表排序&#xff0c;按降序排列&#xff0c;获取第一行&#xff1b;二分法查找需要的数据 我按照降序排列后&#xff0c;获取到了第一行&#xff0c;但是通过二分法查找没有获取到 二分法查找 二分查找&#xff0c;对排序数组通过二分区间排除的方法进行快速…

最好用的六款虚拟机软件,赶紧收藏

在日常工作和学习中,我们常常需要在一台电脑上运行多个操作系统,以便进行软件测试、开发、学习以及实验等任务。虚拟机软件就是一种崭新的技术,它可以在一台电脑上运行多个操作系统,为用户提供了更高效、安全、稳定和智能化的工作和学习环境。今天我为大家介绍6款优秀的虚拟…

k8s安装监控工具metrics-server

我们需要监控cpu和内存的使用率.以便提供硬件资源的申请采购建议. 也方便我们知道运行负荷, 而不是糊里糊涂出了问题再去解决或者工具自动解决了而我们不知道, 话说回来集群的好处就是低成本的达到高性能, 性能不去监控就有点太不专业了. 但, k8s居然不自带监控工具 https://ku…

了解hiberfil.sys文件:计算机休眠模式的背后

简介: hiberfil.sys是Windows操作系统中的一个文件&#xff0c;它通常存储在计算机的根目录下&#xff0c;用于保存休眠模式下的内存映像。当您将计算机置于休眠模式时&#xff0c;Windows会将所有正在运行的程序和数据保存到hiberfil.sys文件中&#xff0c;然后关闭计算…

SAP MRP例外信息解释

SAP中MRP的例外信息&#xff0c;一共分为八类&#xff0c;下面是所有例外信息的解释 第一类&#xff1a; 69&#xff1a;BOM组件可能是递归的&#xff0c;即自己的子集中包括了自己。 02&#xff1a;订单创建日期在过去&#xff0c;可能是没有及时处理&#xff0c;这个建议表…

【Python爬虫实战】汽车城最好的十款车,第一名竟是这款车...Python教你一键采集二手车数据信息实现数据可视化展示哦~(附视频教程)

前言 驾考不易&#xff0c;天天早起去练车&#xff0c;无论烈日还是下雨&#xff0c;通通都在室外进行&#xff0c;但想要拿证&#xff0c;一定要坚 持不懈的去练车。 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或…

【Docker】2、Docker 基本操作【镜像操作】

目录 一、镜像相关命令(1) 镜像名称格式(2) 常见镜像命令 二、从 DockerHub 拉取镜像案例三、镜像导出和导入案例四、拉取 Redis 镜像练习 一、镜像相关命令 (1) 镜像名称格式 &#x1f50b; 镜像名称一般由两部分组成&#xff1a;[repository]:[tag] &#x1f50b; 若没有指…

Java每日一练(20230428)

目录 1. 搜索旋转排序数组 &#x1f31f;&#x1f31f; 2. 用栈实现队列 &#x1f31f; 3. x 的平方根 &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 搜索旋转排序…

机器学习:基于PCA对人脸识别数据降维并建立KNN模型检验

基于PCA对人脸识别数据降维并建立KNN模型检验 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&…

nodejs+vue+springboot+python电影放映厅购票网站

&#xff08;结合完成了以上的基本目标之后&#xff0c;能够帮助管理人员对系统的方便管理&#xff0c;从而能够为管理员节省时间&#xff0c;给了用户极大的方便。系统中的数据要存储于数据库当中&#xff0c;能够通过SQL代码把数据库中的数据取出&#xff0c;映射到实体类中&…

Classic AUTOSAR专题 | 存储模块简介

往期小怿向各位小伙伴介绍了Classic AUTOSAR的OS模块&#xff0c;相信看过的小伙伴对Classic AUTOSAR的OS已经有基本的认知了&#xff0c;本期我们将继续介绍Classic AUTOSAR专题之存储模块的知识。 目录 1.AUTOSAR存储模块概述 2.NvM功能简介 3.应用层SWC如何访问NvM 4.小…

在Docker中安装并运行Redis(纯步骤)

在Docker中安装并运行Redis容器实例 此文章只有操作步骤&#xff0c;没有原理解释&#xff0c;只供学习时提醒安装步骤。 安装并运行可以分为四步 第一步&#xff1a;安装redis镜像 从远程仓库上查询redis的相关版本信息&#xff08;可以省略&#xff09; docker search red…

mac环境VSCode 配置C++,并写Hello World

安装VSCode&#xff0c;点击下载链接&#xff0c;下载Mac版本的vscode。安装“C extension for VS Code”&#xff0c;在扩展 (⇧⌘X)中搜索c&#xff0c;并安装确保CLANG安装成功。在mac的终端下输入clang --version&#xff0c;如果安装成功会打印相关信息&#xff0c;未成功…

《基于深度卷积神经网络的光电容积脉搏图血管老化评估》阅读笔记

目录 一、论文摘要 二、十个问题 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一…

亚马逊云科技帮助创新成长企业云端构建、全球化布局及规模化增长

4月13日&#xff0c;以“加速创新&#xff0c;成就未来”为主题的亚马逊云科技创新成长中国行深圳论坛圆满举行。会上亚马逊云科技宣布&#xff0c;将围绕创新成长企业的三大业务需求——云上创新、出海拓展、业务加速&#xff0c;提供行业聚焦、技术支撑、伙伴扶持、人才培养四…

Dubbo 高级特性 (3)

其实Dubbo的官方文档非常强大&#xff0c;里面的各种各样的标签都会介绍到&#xff0c;但是最新版的官方文档好像找不那么多详细的使用了。在此&#xff0c;我推荐一篇博客&#xff0c;里面列举的也蛮全面的&#xff0c;可以参考&#xff1a; dubbo配置参考手册_dubbo使用手册_…

前端叹了口气,并表示谣言止于智者

如何评价此次“前端已死”言论引起的轩然大波&#xff1f; 从市景角度来看&#xff0c;那就是“一传十&#xff0c;十传百&#xff0c;越传越离谱”。 从新闻角度来看&#xff0c;是“传播扭曲效应”&#xff0c;指信息传播的链条越长&#xff0c;信息越失真。 用《乌合之众…

博客系统[Java]

目录 一.准备工作 二.实现数据库代码(JDBC) 1.创建数据库/表结构>数据库设计 2.封装数据库(Model) 1>创建DBtil封装数据库连接操作 2>创建实体类-->表示一条记录 3>封装针对数据的增删改查 三.博客列表页 1.约定前后端 2.编写服务器代码 3.编写客户端…

【笔试强训选择题】Day7.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…

使用注解实现REDIS分布式锁

一、业务背景 有些业务请求&#xff0c;属于耗时操作&#xff0c;需要加锁&#xff0c;防止后续的并发操作&#xff0c;同时对数据库的数据进行操作&#xff0c;需要避免对之前的业务造成影响。 二、分析流程 使用 Redis 作为分布式锁&#xff0c;将锁的状态放到 Redis 统一…