技术复盘(3)--ElasticSearch

news2025/1/10 1:25:34

技术复盘--ElasticSearch

  • 技术复盘(3)--ElasticSearch
  • 资料地址
  • 概述
  • 对比solr
  • windows下使用es
  • IK分词器介绍
  • es基本命令
  • 集成springboot以及调用api

技术复盘(3)–ElasticSearch

ElasticSearch7.x

资料地址

ElasticSearch官网:https://www.elastic.co/
ElasticSearch-head地址:https://github.com/zt1115798334/elasticsearch-head-master
ElasticSearch-kibana官网:https://www.elastic.co/cn/kibana/
ElasticSearch-ik分词器:https://github.com/medcl/elasticsearch-analysis-ik
学习地址-B站狂神:https://www.bilibili.com/video/BV17a4y1x7zq

概述

Elaticsearch,简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、可以扩展到上百台服务器,处理PB级别的数据。es也使用lava开发并使用lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTfulAPI来隐藏Lucene的复杂性,从而让全文搜索变得简单。

对比solr

  1. es基本是开箱即用(解压就可以用!),非常简单。Solr安装略微复杂一丢丢!
  2. Solr利用Zookeeper进行分布式管理,而Elasticsearch自身带有分布式协调管理功能。
  3. Solr支持更多格式的数据,比如JSON、XML、CSV,而Elasticsearch仅支持json文件格式。
  4. Solr 查询快,但更新索引时慢(即插入删除慢),用于电商等查询多的应用;·ES建立索引快(即查询慢),即实时性查询快,用于facebook新浪等搜索。

windows下使用es

一共安装3个软件,elasticsearch,elasticsearch-head-master和kibana,以及为elasticsearch配置ik分词器,软件下载地址在最上方,都是开箱即用,简单修改下配置文件即可。

1.解压elasticsearch后,先解决跨域问题,因为es端口为9200,head端口为9100,两者之间通讯会发生跨域。【不懂跨域是什么的也跟着做,不会错】,修改es安装目录下的config目录中的elasticsearch.yml配置文件,把下面两行加在最后面,保存退出即可。

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

在这里插入图片描述
2.配置ik分词器,将ik分词器解压到es的pulgins目录下即可
在这里插入图片描述

3.启动:双击bin目录下elasticsearch.bat,es7.6最低要求jdk1.8,默认内存最低1G。

在这里插入图片描述
4.在浏览器输入http://localhost:9200/ 可查看es信息。

在这里插入图片描述

5.安装可视化界面:下载head插件,要求有vue环境,如nodejs。操作流程:在head目录下启动cmd,输入npm install安装head依赖。
在这里插入图片描述
6.启动head可视化插件,npm run start,启动成功后在浏览器地址栏输入http://localhost:9100/ 可查看到head可视化界面。
在这里插入图片描述
7.安装kibana,安装后修改下kibana的配置文件即可完成汉化,如下图,启动的话找到bin目录中的kibana.bat双击即可,启动成功后地址栏输入http://localhost:5601/ 即可访问。
Kibana是一款开源的数据可视化工具,主要用于展示和分析 Elasticsearch 中的数据。它提供了强大的图表、地图和可视化工具,使用户更容易理解大量数据的含义和趋势,帮助用户快速地发现数据中的问题和机会。Kibana 还允许用户创建自定义仪表盘,以适应不同的业务需求。它是 ELK(Elasticsearch、Logstash 和 Kibana)技术栈中的一部分,常用于日志管理、安全监控、业务分析等领域。
在这里插入图片描述
至此安装完成!恭喜!

IK分词器介绍

ik分词器中提供了两种分词方式:ik_smart和ik_max_word
ik_smart:适当拆分,粗粒度
ik_max_word:极限拆分,细粒度
es中有关于分词的数据有两种类型:text和keyword

text:可以被分词器分词,默认数据类型都为text
keyword:不能分词

用kibana举个例子:图一是ik_smart,图二是ik_max_word
在这里插入图片描述
在这里插入图片描述
还需要介绍的一点就是扩展分词库,比如一些新兴的网络热词,ik分词器中是无法识别的,需要手动配置,手动配置流程如下图,图中的wode.dic是自己加的一个分词库。这种方法比较笨,可采取更智能的方法,比如对接一个热点接口,每隔一小时就拉取一下热点词存入分词器中。
在这里插入图片描述

es基本命令

在这里插入图片描述
es练习语句,只包含常用的高亮、查询指定字段、分页查询,代码不难,结合图一起看很好理解,就没写注释:

PUT /student/type/4
{
  "name":"学生4",
  "des":"我是学生4",
  "age":19
}

GET /student/type/_search
{
  "query": {
    "match": {
      "name": "学生1"
    }
  },
  "highlight": {
    "pre_tags": "<p class='key' style='color:red'>",
    "post_tags": "</p>", 
    "fields": {
      "name":{}
    }
  }, 
  "_source": ["name","age"],
  "from": 0,
  "size": 4
}

查询语句运行结果:
在这里插入图片描述

集成springboot以及调用api

springboot集成Java REST Client
1.创建项目,注意springboot的版本,默认为3.x,我们选择2.x的,以及在nosql中勾上es。
在这里插入图片描述
2.springboot默认的es版本可能和我们需要的不一致,那么就需要在pom文件中自定义es版本
在这里插入图片描述
3.编写配置文件

    @Bean
    public RestHighLevelClient restHighLevelClient() {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http")));
        return client;
    }

在这里插入图片描述
4.编写一个实体
在这里插入图片描述
实体代码:

package com.example.springbootes.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class student {
    private String name;
    private int age;

    public student(String name) {
        this.name = name;
    }

    public student(int age) {
        this.age = age;
    }
}

5.开始测试

在这里插入图片描述
测试代码:

package com.example.springbootes;


import com.alibaba.fastjson.JSON;
import com.example.springbootes.entity.student;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.util.ArrayList;

@SpringBootTest
class SpringbootEsApplicationTests {

    // 自动注入es
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    //创建索引
    @Test
    void esTestAdd() throws IOException {
        try {
            // 创建请求
            CreateIndexRequest student_index = new CreateIndexRequest("student_index");
            // 提交创建请求
            CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(student_index, RequestOptions.DEFAULT);
            //打印返回结果 是否创建成功 只能是成功 不成功直接报异常
            System.out.println("createIndexResponse:"+createIndexResponse.isAcknowledged());
        }catch (Exception e){
            System.out.println("请查看该索引是否已被创建");
        }

    }

    //判断索引是否存在
    @Test
    void esTestGet() throws IOException {
        GetIndexRequest student_index = new GetIndexRequest("student_index");
        boolean exists = restHighLevelClient.indices().exists(student_index, RequestOptions.DEFAULT);
        System.out.println("exists ==> "+exists);
    }

    //删除索引
    @Test
    void esTestDelete()  {
        try {
            DeleteIndexRequest student_index = new DeleteIndexRequest("student_index");
            AcknowledgedResponse delete = restHighLevelClient.indices().delete(student_index, RequestOptions.DEFAULT);
            //是否删除成功 只能是成功 因为不成功会抛异常
            System.out.println("delete ==> "+delete.isAcknowledged());
        }catch (Exception e){
            System.out.println("请查看该索引是否已被删除");
        }
    }

    //插入文档 对标mysql为插入数据
    @Test
    void addData(){
        try {
            student student1 = new student("张三21", 17);
            // 创建请求
            IndexRequest student_index = new IndexRequest("student_index");
            //不给id就会随便创建一个id 给了id可以如果es中无此id的数据 则创建 有则修改
            student_index.id("1");
            student_index.source(JSON.toJSONString(student1), XContentType.JSON);
            // 提交创建请求
            IndexResponse indexResponse = restHighLevelClient.index(student_index, RequestOptions.DEFAULT);
            //打印返回结果 是否创建成功 只能是成功 不成功直接报异常
            System.out.println("indexResponse:"+indexResponse.toString());
            System.out.println("indexResponse:"+indexResponse.status());
        }catch (Exception e){
            System.out.println("请查看该索引是否已被创建");
        }
    }

    //判断文档是否存在
    @Test
    void isExitDoc() throws IOException {
        GetRequest student_index = new GetRequest("student_index", "1");
        student_index.fetchSourceContext(new FetchSourceContext(false));
        boolean exists = restHighLevelClient.exists(student_index, RequestOptions.DEFAULT);
        //存在为true 不存在为false
        System.out.println("exists:"+exists);
    }

    //获取文档内容
    @Test
    void getDoc() throws IOException {
        GetRequest student_index = new GetRequest("student_index", "1");
        GetResponse documentFields = restHighLevelClient.get(student_index, RequestOptions.DEFAULT);
        // 获取的结果本质为一个json
        System.out.println("documentFields:"+documentFields);
        System.out.println("documentFields:"+documentFields.getSource());
    }

    //更新文档内容
    @Test
    void updateDoc() throws IOException {
        UpdateRequest student_index = new UpdateRequest("student_index", "1");

        student student = new student("法外狂徒张三",99);
        student_index.doc(JSON.toJSONString(student),XContentType.JSON);

        UpdateResponse update = restHighLevelClient.update(student_index, RequestOptions.DEFAULT);
        // 获取的结果本质为一个json
        System.out.println("update:"+update);
    }

    //删除文档记录
    @Test
    void deleteDoc() throws IOException {
        DeleteRequest student_index = new DeleteRequest("student_index", "1");
        DeleteResponse delete = restHighLevelClient.delete(student_index, RequestOptions.DEFAULT);
        System.out.println("delete:"+delete);
        System.out.println("delete:"+delete.status());
    }

    //批量插入
    @Test
    void bulkAddDoc() throws IOException {
        BulkRequest bulkRequest = new BulkRequest();
        ArrayList<student> students = new ArrayList<>();
        students.add(new student("zhang san",19));
        students.add(new student("ls ii",25));
        students.add(new student("wang wu",45));
        students.add(new student("网五",33));
        students.add(new student("法外狂徒",18));

        for (int i = 0; i < students.size(); i++) {
            bulkRequest.add(
                    new IndexRequest("student_index")
                            .id(""+i)
                            .source(JSON.toJSONString(students.get(i)),XContentType.JSON));
        }

        BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulkResponse.toString());
    }

    //查询
    /***
     *
     *在java rest client中调用termQuery查不到数据,这个问题是java rest client客户端自带的bug,换用matchPhraseQuery直接替换即可。
     * 如果存储数据是英文,则不会出现这个问题
     *
     */
    @Test
    void search() throws IOException {
        SearchRequest searchRequest = new SearchRequest("student_index");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("name", "三");
        searchSourceBuilder.query(matchQuery);
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(2);
        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(searchResponse);
    }

}

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

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

相关文章

unity3d:网络同步,状态同步,源码,C#服务器demo

协议数据单元 网络同步包最小单元PDU // 预测的基础数据类型 public class PDU { public uint UID; //玩家的唯一id public PDUType type; //PDU类型 public Vector3 position; // 位置 public Vector3 forward; // 朝向 public float speed; // 速度: 速度为…

【STL十一】无序容器(哈希容器)—— unordered_map、unordered_set

【STL十一】无序容器&#xff08;哈希容器&#xff09;—— unordered_map、unordered_set一、简介1、关联容器和无序容器不同2、无序容器特点二、头文件三、模板类四、无序容器的内部结构1、管理桶2、内部结构五、unordered_map成员函数1、迭代器2、元素访问3、容量4、修改操作…

CV大模型应用:Grounded-Segment-Anything实现目标分割、检测与风格迁移

Grounded-Segment-Anything实现目标分割、检测与风格迁移 文章目录Grounded-Segment-Anything实现目标分割、检测与风格迁移一、Segment-Anything介绍二、Grounded-Segment-Anything1、简介2、测试一、Segment-Anything介绍 代码链接&#xff1a;https://github.com/facebookr…

Direct3D 12——混合——雾

实现雾化效果的流程如下&#xff1a;如图所示&#xff0c;首先指明雾的颜色、由摄像机到雾气的最近距离以及雾 的分散范围(即从雾到摄像机的最近距离至雾能完全覆盖物体的这段范围)&#xff0c;接下来再将网格三角形上点 的颜色置为原色与雾色的加权平均值&#xff1a; foggedC…

Python爬虫之多线程加快爬取速度

之前我们学习了动态翻页我们实现了网页的动态的分页&#xff0c;此时我们可以爬取所有的公开信息了&#xff0c;经过几十个小时的不懈努力&#xff0c;一共获取了 16万 条数据&#xff0c;但是软件的效率实在是有点低了&#xff0c;看了下获取 10 万条数据的时间超过了 56 个小…

【技巧】Word“只读方式”的设置与取消

如果你担心在阅读Word文档的时候&#xff0c;不小心修改并保存了内容&#xff0c;那就给文档设置“只读方式”吧&#xff0c;这样就算不小心做了修改也不能随意保存。 Word文档的“只读方式”有两种模式&#xff0c;对此不清楚的小伙伴&#xff0c;来看看如何设置和取消吧。 模…

第一次作业

作业内容&#xff1a;1&#xff0c;atd和crond的区别 2&#xff0c;指定在2023/08/26 09&#xff1a;00将时间写入testmail.txt文件中 3&#xff0c;指定在每天凌晨4&#xff1a;00将该时间点之前的系统日志信息备份到个目录下&#xff08;/var/log/messages &#xff09;&…

华为手表开发:WATCH 3 Pro(17)传感器订阅指南针

华为手表开发&#xff1a;WATCH 3 Pro&#xff08;17&#xff09;传感器订阅指南针初环境与设备指南针传感器介绍与说明鸿蒙开发文件夹&#xff1a;文件新增展示的文本标记index.hmlindex.cssindex.js初 希望能写一些简单的教程和案例分享给需要的人 鸿蒙可穿戴开发 环境与设…

二 、Locust自定义用户(场景)

二 、自定义用户&#xff08;场景&#xff09; 一个用户类代表了你系统中的一种用户/场景。当你做一个测试运行时&#xff0c;你指定你想模拟的并发用户的数量&#xff0c;Locust将为每个用户创建一个实例。你可以给这些类/实例添加任何你喜欢的属性&#xff0c;但有一些属性对…

蹭ChatGPT热点有风险,昆仑万维蹭热点被发监管函

‍数据智能产业创新服务媒体——聚焦数智 改变商业要说2023年互联网行业最火爆的概念&#xff0c;ChatGPT绝对当仁不让。国外有微软&#xff0c;国内有百度、阿里、商汤、三六零等&#xff0c;各大互联网巨头都对这个概念青睐有加。众多企业纷纷宣布投身赛道&#xff0c;誓要做…

帮助企业应对不确定性,Serverless时代正在来临

近年来层出不穷的“黑天鹅”事件&#xff0c;让越来越多的企业和组织开始高度关注市场的不确定性。为了增强抵御风险的能力&#xff0c;企业纷纷从开拓业务创新、降低生产成本、提高运营效率、提升用户体验及满意度等方面着手&#xff0c;努力提高自身的核心竞争力。在这样的时…

Java集合——List接口学习总结

一、ArrayList实现类 1. 常用方法 增加&#xff1a;add(int index, E element)删除&#xff1a;remove(int index) remove(Object o)修改&#xff1a;set(int index, E element)查看&#xff1a;get(int index)判断&#xff1a;常用遍历方式&#xff1a;//List集合 遍历&…

2023MathorCup数模C题思路数据代码论文【全网最全分享】

文章目录赛题思路赛题详情参赛建议&#xff08;个人见解&#xff09;选择队友及任务分配问题&#xff08;重要程度&#xff1a;5星&#xff09;2023MathorCup数模C题思路数据论文代码【最新】赛题思路 (赛题出来以后第一时间在CSDN分享) 最新进度在文章最下方卡片&#xff0c;…

Atlassian后Server时代 | Server版vs.数据中心版,二者的区别在哪里?

2024年2月&#xff0c;也就是一年不到&#xff0c;Atlassian将终止对Server产品及插件的所有支持。 此公告发布后&#xff0c;许多用户需要了解怎样的前进方向才是最适合企业的。为此&#xff0c;Atlassian提供了本地部署的数据中心&#xff08;Data Center&#xff09;版以及云…

浅聊MVCC,希望能对你有帮助

浅聊MVCC&#xff0c;希望能对你有帮助&#x1f3cd; 前言 多版本并发控制是数据库管理系统中的一项重要技术&#xff0c;它可以提高数据库的并发性能和可靠性&#xff0c;支持高并发的读写操作&#xff0c;提高数据的安全性&#xff0c;具有重要的应用价值和意义。笔者写此文…

好用的5款国产低代码平台介绍

一、云程低代码平台 云程低代码平台是一款基于springboot、vue.js技术的企业级低代码开发平台&#xff0c;平台采用模型驱动、高低码融合、开放扩展等设计理念&#xff0c;基于业务建模、流程建模、表单建模、报表建模、大屏建模等可视化建模工具&#xff0c;通过拖拉拽零代码方…

深入理解Linux多线程

致前行的人&#xff1a; 昨日渐多&#xff0c;明日愈少&#xff0c;今日还在&#xff0c;不要为成功而努力&#xff0c;要为做一个有价值的人而努力。人生道路上充满了坎坷&#xff0c;谁也不可能一帆风顺。只有在最困难的时刻&#xff0c;才能体会到无助的含义。 目录 1.理解…

ESP32-LORA通信

文章目录好久没更新博客了&#xff0c;今天清明节&#xff0c;写个LORA通信。在此记念在天堂的外婆。祝她安好LORA通信简介一、模块二、使用步骤1.电脑通过USB串口模块联接LORA模块2.ESP32连接LORA通信进行收发通信3.电脑运行调试助手&#xff0c;ESP32运行代码。实现LORA通信测…

3.5 函数的极值与最大值和最小值

学习目标&#xff1a; 我要学习函数的极值、最大值和最小值&#xff0c;我会采取以下几个步骤&#xff1a; 理解基本概念&#xff1a;首先&#xff0c;我会理解函数的极值、最大值和最小值的概念。例如&#xff0c;我会学习函数在特定区间内的最高点和最低点&#xff0c;并且理…

ChatGPT的“N宗罪”?|AI百态(上篇)

序&#xff1a; AI诞生伊始&#xff0c;那是人人欣喜若狂的科技曙光&#xff0c;深埋于哲学、想象和虚构中的古老的梦&#xff0c;终于成真&#xff0c;一个个肉眼可见的智能机器人&#xff0c;在复刻、模仿和服务着他们的造物主——人类。 但科技树的点亮&#xff0c;总会遇到…