当前位置: 首页 > news >正文

【Django+Vue3 线上教育平台项目实战】Elasticsearch实战指南:从基础到构建课程搜索与数据同步接口

在这里插入图片描述


文章目录

  • 前言
  • 一、Elasticsearch
    • 倒排索引
  • 二、Docker 搭建 ES
    • Docker 安装
    • Docker 搭建 ES
  • 三、ES基础语法
    • 创建索引
    • 查看索引
    • 删除索引
    • 添加数据
    • 查询数据
    • 修改数据
    • 删除数据
    • 条件查询
      • 分页查询
      • 排序
    • 多条件查询
      • and
      • or
    • 范围查询
  • 四、ES在项目中的应用示例


前言

    在数据驱动的时代,Elasticsearch以其卓越的全文搜索能力和分布式架构,成为处理海量数据的关键工具。本博客将带您从Elasticsearch的基础概念出发,深入解析其核心——倒排索引,并介绍如何在Docker中轻松部署。我们将详细讲解Elasticsearch的基础语法,确保能够掌握其操作精髓。最后,通过一个实战案例——构建课程搜索与数据同步接口,体验Elasticsearch在实际项目中的强大功能。


一、Elasticsearch

    Elasticsearch(简称ES)是一个基于Lucene构建的开源、分布式、RESTful的搜索和分析引擎。 它以其强大的全文搜索能力、高可用性、可扩展性和易用性而广受欢迎,被广泛应用于各种规模的企业和组织中。

倒排索引

    倒排索引 是 Elasticsearch 及其底层 Lucene 引擎实现快速搜索的关键技术。在传统的数据库中,我们是通过文档(或记录)来查找包含特定关键词的文档列表。而在搜索引擎中,这个过程被逆转了:我们根据关键词来查找包含这些关键词的文档列表。这就是“倒排索引”的由来。
在这里插入图片描述

倒排索引是区别于正排索引的概念:

  • 正排索引:是以文档对象的唯一 ID 作为索引,以文档内容作为记录。
  • 倒排索引:Inverted index,指的是将文档内容中的单词作为索引,将包含该词的文档 ID 作为记录。
    在这里插入图片描述

倒排索引的结构
    根据倒排索引的概念,我们可以用一个 Map来简单描述这个结构。这个 MapKey 的即是分词后的单词,这里的单词称为 Term,这一系列的 Term 组成了倒排索引的第一个部分 —— Term Dictionary (索引表,可简称为 Dictionary)
    倒排索引的另一部分为 Postings List(记录表),也对应上述 Map 结构的 Value 部分集合。
记录表 由所有的 Term 对应的数据(Postings) 组成,它不仅仅为文档 id 信息,可能包含以下信息:

  • 文档 id(DocId, Document Id),包含单词的所有文档唯一 id,用于去正排索引中查询原始数据。
  • 词频(TF,Term Frequency),记录 Term 在每篇文档中出现的次数,用于后续相关性算分。
  • 位置(Position),记录 Term 在每篇文档中的分词位置(多个),用于做词语搜索(Phrase Query)。
  • 偏移(Offset),记录 Term 在每篇文档的开始和结束位置,用于高亮显示等。

二、Docker 搭建 ES

Docker 安装

升级所有包同时也升级软件和系统内核:

  • yum -y update

只升级所有包,不升级软件和系统内核:

  • yum -y upgrade

删除自带的docker

  • yum remove docker docker-common docker-selinux docker-engine

安装需要的软件包, yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖

  • yum install -y yum-utils device-mapper-persistent-data lvm2

设置一个yum源,下面两个都可用,选择一个

  • yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)
  • yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)

查看docker可用版本

  • yum list docker-ce --showduplicates | sort -r

安装docker

  • yum -y install docker-ce-18.03.1.ce

设置开机启动

  • systemctl start docker
  • systemctl enable docker

Docker 搭建 ES

docker 拉取 elasticsearch镜像

  • docker pull elasticsearch:7.7.0
  • docker pull docker.elastic.co/elasticsearch/elasticsearch:7.7.0

docker 运行 elasticsearch

  • docker run --name elasticsearch -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 elasticsearch:7.7.0

三、ES基础语法

创建索引

发送put请求: http://localhost:9200/shopping
在这里插入图片描述

查看索引

发送get请求: http://localhost:9200/shopping
在这里插入图片描述

查看所有索引 http://localhost:9200/_cat/indices?v
在这里插入图片描述

删除索引

发送delete请求 http://localhost:9200/shopping
在这里插入图片描述

添加数据

发送post请求 http://localhost:9200/shopping/_doc

请求体Body:
{"name":"张三","age":10,"category":1,"status":1,"online":2
}

在这里插入图片描述

幂等性操作

  • 添加时添加id ,http://localhost:9200/shopping/_doc/1001
    在这里插入图片描述

查询数据

发送get请求

  • 查询单个 http://localhost:9200/shopping/_doc/1002
    在这里插入图片描述

  • 查询全部 http://localhost:9200/shopping/_search
    在这里插入图片描述

修改数据

完全覆盖

  • 发送put请求 http://localhost:9200/shopping/_doc/1001
    在这里插入图片描述

修改某个属性

  • 发送post请求 http://localhost:9200/shopping/_update/1001
发送post请求 http://localhost:9200/shopping/_update/1001
{  "doc": {  "name": "张三22"  }  
}

在这里插入图片描述

删除数据

完全覆盖

  • 发送delete请求 http://localhost:9200/shopping/_doc/1001
    在这里插入图片描述

条件查询

get http://localhost:9200/shopping/_search{"query":{"match":{"category":1}}
}

查询category为1的数据:
在这里插入图片描述

查询所有数据
{"query":{"match_all":{}}
}

查询所有数据:
在这里插入图片描述

分页查询

{"query":{"match_all":{}},"from":0,"size":2
}

在这里插入图片描述

指定name姓名字段
{"query":{"match_all":{}},"from":0,"size":2,"_source":["name"]
}

指定name姓名字段:
在这里插入图片描述

排序

{"query":{"match_all":{}},"from":0,"size":2,"_source":["name","age"],"sort":{"id":{"order":"desc"}}
}

在这里插入图片描述

多条件查询

and

{"query":{"bool":{"must":[{"match":{"age":10}},{"match":{"name":"张三"}}]}},"from":0,"size":2,"_source":["name","age"],"sort":{"age":{"order":"desc"}}
}select * from users where age=10 and name="张三"

select * from users where age=10 and name=“张三”
在这里插入图片描述

or

{"query":{"bool":{"should":[{"match":{"age":10}},{"match":{"name":"张三"}}]}},"from":0,"size":2,"_source":["name","age"],"sort":{"age":{"order":"desc"}}
}select * from users where age=10 or name="张三"

select * from users where age=10 or name=“张三”
在这里插入图片描述

范围查询

es支持常用的语法,通过

  • from size进行分页查询,
  • match条件查询,
  • _source指定返回字段,
  • sort排序,
  • range进行区间查询,
  • must并且查询,
  • should进行或查询
{"query":{"bool":{"should":[{"match":{"age":10}},{"match":{"name":"张三"}}],"filter":{"range":{"age":{"gt":3}}}}},"from":0,"size":2,"_source":["name","age"],"sort":{"age":{"order":"desc"}}
}

在这里插入图片描述

四、ES在项目中的应用示例

使用es查询课程信息:

  • 1.实例化Elasticsearch类
  • 2.es.index创建索引,把记录添加到es中
  • 3.先mysql中的数据加载到es中,第一次全量式同步,后面增量式同步
  • 4.用es._search从查询数据

    下面代码示例展示了如何使用Django REST framework的APIView以及Elasticsearch客户端来实现一个简单的课程搜索和数据同步接口。

#course/views.py
#demo:es
from elasticsearch import Elasticsearch
es = Elasticsearch("http://localhost:9200/")class CourseSearchEs(APIView):#对课程构建索引def get(self, request):dsl = {"query":{"match":{}},'from':0,'size':2,'_source':['id','name','sales']}res = es.search(index="ccourse", body=dsl)data = res['hits']['hits']clist = []for i in data:clist.append(i['_source'])return Response({"code": "200", "data": clist})def post(self, request):# 查询课程中所有数据course = CourseModel.objects.all()# 数据同步---全量式同步for c in course:es.index(index='ccourse',body={'id': c.id,'table_name':'course','name':c.name,'sales':c.sales,'describe':c.describe,})r.setex_str('id',60*60,c.id) #会覆盖,只存最后一次id(最大id)return Response({"code": "200"})
# base/tasks.py
@shared_task
def syn_mysql_es():es = Elasticsearch("http://120.46.9.231:9200/")# 查询上次最终更新课程id后的所有数据cid = r.get_str("id")print(cid)course = CourseModel.objects.filter(id__gt=cid)# 数据同步---增量式同步(定时同步数据)for c in course:es.index(index='ccourse', body={'id': c.id,'table_name': 'course','name': c.name,'sales': c.sales,'describe': c.describe,})r.setex_str('id', 60 * 60, c.id)print("mysql_es_数据同步完成...")

在这里插入图片描述

相关文章:

【Django+Vue3 线上教育平台项目实战】Elasticsearch实战指南:从基础到构建课程搜索与数据同步接口

文章目录 前言一、Elasticsearch倒排索引 二、Docker 搭建 ESDocker 安装Docker 搭建 ES 三、ES基础语法创建索引查看索引删除索引添加数据查询数据修改数据删除数据条件查询分页查询排序 多条件查询andor 范围查询 四、ES在项目中的应用示例 前言 在数据驱动的时代&#xff0c…...

libtins初探-抓包嗅探

libtin 一、概述1. 可移植性2. 特性 二、基础知识1. PDU2. 地址类3. 地址范围类4. 网络接口5. 写pcap文件 三、嗅探1.嗅探基础2. 嗅探器配置3. 循环嗅探4. 使用迭代器嗅探6. 包对象7. 读取pcap文件8. 包的解析 四、发送包1. 发送网络层pdu2. 发送链路层pdu3. 发送和接收响应校验…...

大语言模型-Bert-Bidirectional Encoder Representation from Transformers

一、背景信息: Bert是2018年10月由Google AI研究院提出的一种预训练模型。 主要用于自然语言处理(NLP)任务,特别是机器阅读理、文本分类、序列标注等任务。 BERT的网络架构使用的是多层Transformer结构,有效的解决了长…...

bug诞生记——动态库加载错乱导致程序执行异常

大纲 背景问题发生问题猜测和分析过程是不是编译了本工程中的其他代码是不是有缓存是不是编译了非本工程的文件是不是调用了其他可执行文件查看CMakefiles分析源码检查正在运行程序的动态库 解决方案 这个案例发生在我研究ROS 2的测试Demo时发生的。 整体现象是:修改…...

Matlab演示三维坐标系旋转

function showTwo3DCoordinateSystemsWithAngleDifference() clear all close all % 第一个三维坐标系 origin1 [0 0 0]; x_axis1 [1 0 0]; y_axis1 [0 1 0]; z_axis1 [0 0 1];% 绕 x 轴旋转 30 度的旋转矩阵 theta_x 30 * pi / 180; rotation_matrix_x [1 0 0; 0 cos(th…...

redis的持久化机制以及集群模式

1.redis的持久化机制 内存数据库具有高速读写的优势,但由于数据存储在内存中,一旦服务器停止或崩溃,所有数据将会丢失。持久化机制的引入旨在将内存中的数据持久化到磁盘上,从而在服务器重启后能够恢复数据,提供更好的…...

【论文解读】大模型算法发展

一、简要介绍 论文研究了自深度学习出现以来,预训练语言模型的算法的改进速度。使用Wikitext和Penn Treebank上超过200个语言模型评估的数据集(2012-2023年),论文发现达到设定性能阈值所需的计算大约每8个月减半一次,95%置信区间约为5到14个月…...

WebApi配置Swagger、Serilog、NewtonsoftJson、Sqlsugar、依赖注入框架Autofac、MD5加密

文章目录 项目准备1、创建WebApi项目配置Swagger、Serilog、NewtonsoftJsonNewtonsoftJsonSwaggerSerilog 使用ORM框架SqlSugar创建Service类库构成MVC框架使用AutoFac进行依赖注入 创建用户登录接口添加用户时进行安全防护 项目准备 1、创建WebApi项目 配置Swagger、Serilog…...

【ffmpeg命令基础】视频选项讲解

文章目录 前言设置输出文件的帧数设置每秒播放的帧数设置输出视频的帧率示例1:更改输出视频的帧率示例2:将图像序列转换为视频 设置输入视频的帧率示例3:处理高帧率视频示例4:处理低帧率视频 同时设置输入和输出帧率示例5&#xf…...

使用uniapp开发小程序(基础篇)

本文章只介绍微信小程序的开发流程,如果需要了解其他平台的开发的流程的话,后续根据情况更新相应的文章,也可以根据uniapp官网的链接了解不同平台的开发流程 HBuilderX使用:https://uniapp.dcloud.net.cn/quickstart-hx.html 开发工具 开始…...

vue3【详解】组合式函数

什么是组合式函数? 利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数,用于实现逻辑复用,类似 react18 中的 hook 函数名称 – 以 use 开头,采用驼峰命名,如 useTitle参数 – 建议使用 toValue() 处理(…...

微服务实战系列之玩转Docker(六)

前言 刚进入大暑,“清凉不肯来,烈日不肯暮”,空调开到晚,还是满身汗。——碎碎念 我们知道,仓库可见于不同领域,比如粮食仓库、数据仓库。在容器领域,自然也有镜像仓库(registry&…...

Python题解Leetcode Hot100之动态规划

动态规划解题步骤-5部曲 确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 70. 爬楼梯 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到…...

你了解GD32 MCU上下电要求吗

你了解GD32 MCU的上下电要求吗?MCU的上下电对于系统的稳定运行非常重要。 以GD32F30X为例,上电/掉电复位波形如如下图所示。 上电过程中,VDD/VDDA电压上电爬坡,当电压高于VPOR(上电复位电压)MCU开始启动&a…...

二、【Python】入门 - 【PyCharm】安装教程

往期博主文章分享文章: 【机器学习】专栏http://t.csdnimg.cn/sQBvw 目录 第一步:PyCharm下载 第二步:安装(点击安装包打开下图页面) 第三步:科学使用,请前往下载最新工具及教程&#xff1a…...

2、程序设计语言基础知识

这一章节的内容在我们的软件设计师考试当中,考的题型比较固定,基本都是选择题,分值大概在2~4分左右。 而且考的还多是程序设计语言的一些基本语法,特别是这两年比较火的Python。 所以对于有一定要编程基础的即使本章的内容不学习&…...

ARM/Linux嵌入式面经(十八):TP-Link联洲

文章目录 虚拟内存,页表,copy on write面试题1:面试题2:面试题3:进程和线程的区别红黑树和b+树的应用红黑树的应用B+树的应用视频会议用了哪些协议1. H.323协议2. SIP协议(会话发起协议)3. WebRTC(网页实时通信)4. 其他协议io多路复用(select,poll,epoll)面试题li…...

解读vue3源码-响应式篇2

提示:看到我 请让我滚去学习 文章目录 vue3源码剖析reactivereactive使用proxy代理一个对象1.首先我们会走isObject(target)判断,我们reactive全家桶仅对对象类型有效(对象、数组和 Map、Set 这样的集合类型),而对 str…...

【测开能力提升-fastapi框架】fastapi能力提升 - 中间件与CORS

1. 中间件 1.1 介绍(ChatGPT抄的,大致可以理解) 一种机制,用于在处理请求和响应之前对其进行拦截、处理或修改。中间件可以在应用程序的请求处理管道中插入自定义逻辑,以实现一些通用的功能,如身份验证、…...

centos7安装es及简单使用

为了方便日后查看,简单记录下! 【启动es前,需要调整这个配置文件(/opt/elasticsearch-6.3.0/config/elasticsearch.yml)的两处ip地址,同时访问页面地址的ip:9200时,ip地址也对应修改】 【启动kibana前,需要调整这个配置文件(/opt/kibana-6.3.0/config/k…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

爬虫基础学习day2

# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...

PH热榜 | 2025-06-08

1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...

计算机系统结构复习-名词解释2

1.定向:在某条指令产生计算结果之前,其他指令并不真正立即需要该计算结果,如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方,那么就可以避免停顿。 2.多级存储层次:由若干个采用不同实现技术的存储…...

代理服务器-LVS的3种模式与调度算法

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们上一章介绍了Web服务器,其中以Nginx为主,本章我们来讲解几个代理软件&#xff1a…...