28.JavaWeb-Elasticsearch

1.Elasticsearch概述

        Elasticsearch 是一个分布式的全文检索引擎。采用Java语言开发,基于Apache协议的开源项目,具有实时搜索,稳定,可靠,快速的特点。

1.1 全文检索引擎

        分为通用搜索引擎(百度、谷歌)与站内搜索引擎,全文检索在处理非结构化文本数据方面非常有用

1.2 结构化数据与非结构化数据

        每个属性都有对应的字段的数据就是结构化数据,反之无法用二维表表述的数据就是非结构化数据

1.3 ES全文检索的原理

        Elasticsearch基于Lucene库构建而成,它使用了倒排索引的方式来实现全文检索。

1.3.1 倒排索引

        就是查找内容,根据内容得到内容所在文档

1.3.2 正排索引

        就是通过路径找到文档,再从文档找某段内容

2. ES安装

Elasticsearch:官方分布式搜索和分析引擎 | Elastic在 RESTful 风格的分布式免费开源搜索和分析引擎开源中,Elasticsearch 处于领先地位,速度快,可实现水平可扩展性和可靠性,并能让您轻松进行管理。免费启用。https://www.elastic.co/cn/elasticsearch/

2.1 启动ES

        双击 bin/elasticsearch.bat

TIPS:
启动后ES会占用两个端口。
9200:ES对外提供服务的端口
9300:ES进行集群间通信与数据传输的端口

2.2 修改ES的配置文件

elasticsearch-8.8.2\config\elasticsearch.yml

2.3 添加编码配置

elasticsearch-8.8.2\config\jvm.options 

2.4 打开浏览器访问

http://localhost:9200

 3.ES的使用

常见操作
新增索引PUT http://localhost:9200/job
查询索引中数据GET http://localhost:9200/job
删除索引DELETE http://localhost:9200/job
查询所有索引数据GET localhost:9200/_all
查询索引的摘要信息GET http://localhost:9200/_cat/indices?v
获取所有映射GET http://localhost:9200/_mapping

3.1 启用/关闭索引

POST http://localhost:9200/job/_close
POST http://localhost:9200/job/_open

3.2 ES的数据类型

类型说明示例
text当一个字段是要被全文搜索的,比如文章内容、产品描
述等使用text类型。
设置text类型以后,字段内容会被分析,在生成倒排索
引以前,字符串会被分一个一个词项。
比如:java软件工程师,
会被分词为 java 、 软
件 、 工程师
keywordkeyword类型适用于索引结构化的字段,如果字段需要
进行过滤、排序、聚合。keyword类型的字段只能通过
精确值搜索到。
比如:城市,我们搜索北
京、深圳,这类词不应该
被拆分。
date通过format设置日期格式,常见的可以设置成年月日时分秒、年月日及毫秒值三种格式。
ignore_malformed。默认值false。如果为true,则忽略格式错误的数字。如果为false(默认值),则格式错误的数字将引发异常并拒绝整个文档。
null_value。默认是null。接受采用配置格式之一的日期值作为该字段,以替换任何显式的空值。默认为null,这意味着该字段被视为丢失。
byte,short,integer,long整型比如:职位ID、薪水。
float, half_float, scaled_float,double浮点型
integer_range, long_range, float_range,double_range,date_range范围型

4.SpringBoot整合ES

        Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷。包括非关系数据库、Map-Reduce 框架、云数据服务、关系数据库的访问支持等。

        Spring Data ElasticSearch 基于 Spring Data API 简化 ElasticSearch操作,将原始操作ElasticSearch的客户端API 进行封装 。与ElastichSearch交互简化数据访问层开发。

4.1 导入依赖

        注意使用的JDK版本应与ES版本的兼容问题

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

4.2 配置Elasticsearch连接信息

spring:elasticsearch:uris: http://localhost:9200

4.3 配置实体类

@Data
@Document(indexName = "esgoods") //indexName:索引的名称(必填项)
public class Goods {@Id  //主键的唯一标识private Integer id;//index:是否设置分词。searchAnalyze:搜索时使用的分词器。type: 数据类型@Field(index = true,type = FieldType.Text,searchAnalyzer = "ik_smart")private String name;private Integer stock;      // 库存@Field(type = FieldType.Text,searchAnalyzer = "ik_smart")private String description; // 描述
}
注解作用
@Document(indexName = "esgoods")用于指定该Java类映射到Elasticsearch中的索引名称。在这里,该类映射到名为"esgoods"的索引。
@Id用于标记文档的主键字段。在这里,id字段将被用作文档的主键。
@Field(index = true, type = FieldType.Text, searchAnalyzer = "ik_smart")用于配置类中的字段。在这里,name字段将被映射为Elasticsearch文档的一个字段,并且允许进行分词索引,使用的分词器是"ik_smart"。

4.4 编写Repository

        继承ElasticsearchRepository接口可以获得常用的数据操作方法

@Repository
public interface EsGoodsRepository extends ElasticsearchRepository<Goods,Integer> {Page<Goods> findByNameOrDescriptionOrderByIdDesc(String name, String description, Pageable pageable);
}

        ElasticsearchRepository接口是Spring Data Elasticsearch库提供的接口之一,它继承自Spring Data的CrudRepository接口,因此具备了常见的CRUD操作方法,如保存、查询、更新和删除等。

Spring Data Elasticsearch - Reference Documentationicon-default.png?t=N6B9https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.repositories

4.5 实现方法

4.5.1 将数据库中数据导入ES

@Overridepublic int importAll() {List<Goods> goods = goodsMapper.selectAll();Iterable<Goods> iterable = goodsRepository.saveAll(goods);Iterator<Goods> iterator = iterable.iterator();int count = 0;while (iterator.hasNext()) {iterator.next();count++;}return count;}

4.5.2 实现搜索方法

@Overridepublic Page<Goods> search(String keyword, Integer pageNum, Integer pageSize) {return goodsRepository.findByNameOrDescriptionOrderByIdDesc(keyword,keyword,PageRequest.of(pageNum,pageSize));}

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

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

相关文章

【深度学习】【Image Inpainting】Generative Image Inpainting with Contextual Attention

Generative Image Inpainting with Contextual Attention DeepFillv1 (CVPR’2018) 论文&#xff1a;https://arxiv.org/abs/1801.07892 论文代码&#xff1a;https://github.com/JiahuiYu/generative_inpainting 论文摘录 文章目录 效果一览摘要介绍论文贡献相关工作Image…

【Java SE】类和对象

目录 【1】面向对象的初步认识 【1.1】什么是面向对象 【1.2】面向对象与面向过程 【2】类定义和使用 【2.1】简单认识类 【2.2】类的定义格式 【2.3】练习 【2.3.1】定义一个狗类 【2.3.2】定义一个学生类 【3】类的实例化 【3.1】什么是实例化 【3.2】类和对象的…

【Java基础学习打卡18】运算符(上)

目录 前言一、运算符和表达式1.运算符2.表达式 二、算术运算符1.加法运算符2.减法运算符3.乘法运算符4.除法运算符5.取余运算符6.表达式类型自动提升 总结 前言 本文主要介绍运算符和表达式&#xff0c;及运算符中的算术运算符。在 Java 编程中&#xff0c;运算符起着非常重要…

Java 使用 Google Guava 实现接口限流

一、引入依赖 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version> </dependency>二、自定义注解及限流拦截器 自定义注解&#xff1a;Limiter package com.haita…

安装requests模块及其他依赖库的完美解决办法

业务场景 导入requests库时报错&#xff0c;单独离线下载安装requests&#xff0c;发现仍然报错&#xff0c;问题在于requests库有其他依赖库。 WARNING: Retrying (Retry(total1, connectNone, readNone, redirectNone, statusNone)) after connection broken by NewConnect…

PgSQL-使用技巧-如何衡量网络对性能的影响

PgSQL-使用技巧-如何衡量网络对性能的影响 PG数据库和应用之间常见的部件有连接池、负载平衡组件、路由、防火墙等。我们常常不在意或者认为涉及的网络hops对整体性能产生的额外开销是理所当然的。但在很多情况下&#xff0c;它可能会导致严重的性能损失和拖累整体吞吐量。相当…

vue 图片的引入方式

一、import 静态引入 放在script标签顶端 例如 import errowPng from ../../assets/404_images/404.png 二、require 动态引入 可以放在data中 data() {return {imgUrl:require("../../assets/404_images/404.png")};}, require 是赋值过程并且是运行时才执行&…

普通的计算机专业大学生如何学习才能找到好offer

2023年已经将近8月份了&#xff0c;回想到开始努力提高自己的时候还是在今年1月1号。开学就要大二了。 一、目标达成情况总结&#xff1a; 一月份&#xff0c;无意间在网上刷到鹏哥的C语言课程&#xff0c;在鸡汤实力课程已拿到大厂offer的同学喜报 &#xff0c;让我萌发了学技…

深入浅出理解vue2/vue3响应式原理

一、简介 当谈论Vue 2和Vue 3的响应式原理时&#xff0c;我们主要关注的是其数据双向绑定的机制。数据双向绑定是指当数据发生变化时&#xff0c;视图会自动更新&#xff1b;反之&#xff0c;当视图发生变化时&#xff0c;数据也会相应地更新。这种特性让我们在前端开发中更加…

Swift 如何确定 scrollView 已经滑动结束

在 iOS 的 UIScrollView 中&#xff0c;你可以通过实现 UIScrollViewDelegate 的方法来检测滑动结束事件。具体来说&#xff0c;你可以实现以下方法&#xff1a; func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {if !decelerat…

Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)

实现抽象类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethodclass BaseMessage(metaclassABCMeta):abstractmethoddef send(self,subject,body,to,name):pass 方式二 class BaseMessage(object):def send(self, subject, body, to, name):raise …

vue3使用响应式数据 + v-model导致响应式失效el-form表单无法输入的问题

文章目录 vue3使用响应式数据 v-model导致响应式失效el-form表单无法输入的问题 vue3使用响应式数据 v-model导致响应式失效el-form表单无法输入的问题 参考文章 重构vue2项目时发现的问题&#xff0c;原始项目使用的是Element-ui。 其实vue3可以使用适配的Element-plus 问…

EasyExcel读取多sheet excel异常

EasyExcel读取多sheet excel异常 场景 使用Spring Boot集成EasyExcel进行导入excel多sheet&#xff0c;执行异常 代码 file是MultipartFile&#xff0c;入参&#xff0c;主要处理流程如下 InputStream is file.getInputStream(); EasyExcel.read(is, SysDict.class, new …

Set集合类详解(附加思维导图)

目录 一、Set集合思维导图 二、set集合类常用方法 2.1、HashSet集合常用方法 2.2、TreeSet集合的使用 三、HashSet、LinkedHashSet、TreeSet的使用场景 四、list和set集合的区别 一、Set集合思维导图 二、set集合类常用方法 2.1、HashSet集合常用方法 ①&#xff1a;add…

redis面试1

Redis基础面试题 1、为什么要使用Redis做缓存 缓存的好处 使用缓存的目的就是提升读写性能。而实际业务场景下&#xff0c;更多的是为了提升读性能&#xff0c;带来更好的性 能&#xff0c;带来更高的并发量。Redis 的读写性能比 Mysql 好的多&#xff0c;我们就可以把 Mysq…

scrapy分布式+指纹去重原理

1&#xff0c;指纹去重原理存在于 scrapy.util.requests 里面 需要安装的包 pip install scrapy-redis-cluster # 安装模块 pip install scrapy-redis-cluster0.4 # 安装模块时指定版本 pip install --upgrade scrapy-redis-cluster # 升级模块版本 2&#xff0c;setting配置 …

【小白必看】利用Python生成个性化名单Word文档

文章目录 前言所需文件及文件格式说明excel数据如下word 模板如下文件目录格式及生成后的文件 导入所需的模块&#xff1a;打开 Excel 文件&#xff1a;选择工作表&#xff1a;获取数据列表&#xff1a;遍历数据并生成 Word 文档&#xff1a;完整代码结束语 前言 对于需要批量…

【MyBatis 学习一】认识MyBatis 第一个MyBatis查询

目录 一、认识MyBatis 1、MyBatis是什么&#xff1f; 2、为什么要学习MyBatis? 二、配置MyBatis环境 1、建库与建表 2、创建新项目 3、xml文件配置 &#xff08;1&#xff09;配置数据库连接 &#xff08;2&#xff09;配置 MyBatis 中的 XML 路径 三、测试&#x…

mysql(三)用户权限管理

目录 前言 一、概述 二、用户权限类型 三、用户赋权 四、权限删除 五、删除用户 前言 为什么要设置用户权限&#xff1f; MySQL设置用户管理权限的主要目的是为了确保数据库的安全性和数据的机密性。以下是一些原因&#xff1a; 1. 安全性&#xff1a;MySQL是一个开源的关系型…

Java集合之List

ArrayLsit集合 ArrayList集合的特点 ArrayList集合的一些方法 ①.add(Object element) 向列表的尾部添加指定的元素。 ②.size() 返回列表中的元素个数。 ③.get(int index) 返回列表中指定位置的元素&#xff0c;index从0开始。 public class Test {public static void m…