【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_数据同步完成...")

在这里插入图片描述

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

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

相关文章

c#Action委托和Func委托

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Action委托 {internal class Program{static void PrintString(){Console.WriteLine("hello world.");}static void PrintInt(int …

大语言模型-RetroMAE-检索预训练模型

一、背景信息: RetroMAE是2022年10月由北邮和华为提出的一种密集检索预训练策略。 RetroMAE主要应用于检索模型的预训练,模型架构为非对称的Encoder-Decode结构。 二、整体结构: RetroMAE的模型架构为非对称的Encoder-Decode结构。 Encod…

C++学习笔记-operator关键字:重载与自定义操作符

在C编程中,operator关键字扮演着极其重要且独特的角色。它允许开发者为内置类型或自定义类型重载或定义新的操作符行为。这一特性极大地增强了C的表达能力,使得代码更加直观、易于理解和维护。本文将深入探讨C中operator关键字的使用,包括操作…

Interesting bug caused by getattr

题意:由 getattr 引起的有趣的 bug 问题背景: I try to train 8 CNN models with the same structures simultaneously. After training a model on a batch, I need to synchronize the weights of the feature extraction layers in other 7 models. …

Elasticsearch:Golang ECS 日志记录 - zap

ECS 记录器是你最喜欢的日志库的格式化程序/编码器插件。它们可让你轻松地将日志格式化为与 ECS 兼容的 JSON。 编码器以 JSON 格式记录日志,并在可能的情况下依赖默认的 zapcore/json_encoder。它还处理 ECS 错误格式的错误字段记录。 默认情况下,会添…

OpenWrt 为软件包和docker空间扩容

参考资料 【openwrt折腾日记】解决openwrt固件刷入后磁盘空间默认小的问题,关联openwrt磁盘扩容空间扩容【openwrt分区扩容】轻松解决空间可用不足的尴尬丨老李一瓶奶油的YouTube 划分空间 参考一瓶奶油的YouTube 系统 -> 磁盘管理 -> 磁盘 -> 修改 格…

【机器学习】不同操作系统下如何安装Jupyter Notebook和Anaconda

引言 Jupyter Notebook 是一个非常流行的开源Web应用程序,允许你创建和共享包含代码、方程、可视化和解释性文本的文档 文章目录 引言一、如何安装Jupyter Notebook1.1 对于Windows用户1.2 对于macOS用户1.3 对于Linux用户: 二、如何安装Anaconda2.1 对于…

基于Element UI内置的Select下拉和Tree树形组件,组合封装的树状下拉选择器

目录 简述 效果 功能描述 代码实现 总结 简述 基于Element UI内置的Select下拉和Tree树形组件,组合封装的树状下拉选择器。 效果 先看效果: 下拉状态: 选择后状态: 选择的数据: 功能描述 1、加载树结构&…

Linux云计算 |【第一阶段】SERVICES-DAY2

主要内容: DNS服务基础及搭建、特殊解析(针对地址库文件:DNS轮询 DNS泛域名解析 DNS别名)、缓存DNS(全局转发forwarders)、DNS递归迭代(子域授权)、DNS主从架构搭建、DNS主从数据同步 一、DNS工…

【技术升级】Docker环境下Nacos平滑升级攻略,安全配置一步到位

目前项目当中使用的Nacos版本为2.0.2,该版本可能存在一定的安全风险。软件的安全性是一个持续关注的问题,尤其是对于像Nacos这样的服务发现与配置管理平台,它在微服务架构中扮演着核心角色。随着新版本的发布,开发团队会修复已知的…

光伏模拟器应用

太阳能光伏 (PV) 模拟器是一种可编程电源,用于模拟太阳能电池板。模拟器具有快速瞬态响应,可响应负载条件的变化并保持电压-电流特性的输出。 用户可以根据系统规格定义太阳能电池板配置,并通过选择环境条件来选择适当的环境条件进行模拟。用…

pytest+allure

安装 下载:github win环境下载zip 环境变量: pycharm: pip install allure-pytest 验证安装 生成结果: if __name__ __main__:pytest.main([-s,test_createTag2.py,--alluredir,result]) 生成报告: allure gener…

如何查看Kafka的偏移量offset

本文介绍三种方法查看Kafka的偏移量offset。 1. API:ConsumerRecord的offset()方法查看offset。 2. API:KafkaConsumer的position(TopicPartition partition)方法查看offset。 3. 命令行:kafka-consumer-groups.sh命令查看offset。 前提条…

前置-Linux相关知识速记

linux Linux命令大全 [!IMPORTANT] chown-chmod-ls-chgrp-cdpwd-mkdir-rmdir-cp-rm-mv-cat-tac-nl-more-less-head-tail 应用领域 通常服务器使用 LAMP(Linux Apache MySQL PHP)或 LNMP(Linux Nginx MySQL PHP)组合。 目前…

STM32 BootLoader 刷新项目 (五) 获取软件版本号-命令0x51

STM32 BootLoader 刷新项目 (五) 获取软件版本号-命令0x51 下面我们来讲解第一个指令,获取软件版本号命令-0x51. 在BootLoader中获取软件版本号的操作有多个重要的作用,具体如下: 版本管理: 识别当前版本:通过获取软…

无人机上磁航技术详解

磁航技术,也被称为地磁导航,是一种利用地球磁场信息来实现导航的技术。在无人机领域,磁航技术主要用于辅助惯性导航系统(INS)进行航向角的测量与校正,提高无人机的飞行稳定性和准确性。其技术原理是&#x…

vue3 + antd vue 纯前端 基于xlsx 实现导入excel 转 json,将json数据转换XLSX导出(模版下载)

一、导入 0、关键代码 // 安装插件 npm i xlsx/yarn add xlsx // 导入xlsx import * as XLSX from xlsx; 点击提交的时候才整理数据。上传的时候文件保存在 state.form.file[0] 中的 // 定义字段映射关系 const fieldMap {sheet2json: {技能名称: skill_name,技能等级: …

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

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

代码随想录——零钱兑换Ⅱ(Leetcode518)

题目链接 完全背包 class Solution {public int change(int amount, int[] coins) {int[] dp new int[amount 1];dp[0] 1;for(int i 0; i < coins.length; i){for(int j coins[i]; j < amount; j){dp[j] dp[j - coins[i]];}}return dp[amount];} }本题为组合问题…

uni-app AppStore Connect上传拒绝汇总

1.Guideline 2.3.3 - Performance - Accurate Metadata 问题是图片不对&#xff0c;最好是自己截图&#xff0c;然后用香蕉云编 上传图片合成图片 2.Guideline 5.1.2 - Legal - Privacy - Data Use and Sharing 解决办法&#xff1a;在uniapp manifest.json找到 APP常用其他…