【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来简单描述这个结构。这个 Map 的 Key 的即是分词后的单词,这里的单词称为 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.tpcf.cn/bicheng/49505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 …

vue3页面编写-导入导出excel、展开查询项等

数据保持 <router-view v-slot"{ Component, route }"><keep-alive><component :is"Component" :key"route.name" v-if"route.meta.keepAlive" /></keep-alive><component :is"Component" :key…

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 多选题序号4

基础认证题库请移步&#xff1a;HarmonyOS应用开发者基础认证题库 注&#xff1a;有读者反馈&#xff0c;题库的代码块比较多&#xff0c;打开文章时会卡死。所以笔者将题库拆分&#xff0c;单选题20个为一组&#xff0c;多选题10个为一组&#xff0c;题库目录如下&#xff0c;…

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

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

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

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

Interesting bug caused by getattr

题意&#xff1a;由 getattr 引起的有趣的 bug 问题背景&#xff1a; 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 格式记录日志&#xff0c;并在可能的情况下依赖默认的 zapcore/json_encoder。它还处理 ECS 错误格式的错误字段记录。 默认情况下&#xff0c;会添…

OpenWrt 为软件包和docker空间扩容

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

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

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

Vue中filter的使用

在 Vue.js 中&#xff0c;filter() 方法用于创建一个新数组&#xff0c;其中包含通过所提供函数实现的测试的所有元素。filter() 不会改变原数组&#xff0c;而是返回一个新的数组。 语法 array.filter(callback(element[, index[, array]])[, thisArg])callback&#xff1a;…

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

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

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

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

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

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

光伏模拟器应用

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

安全产品在防御勒索病毒中的作用

在数字时代&#xff0c;网络安全威胁日益严峻&#xff0c;其中勒索病毒尤为猖獗&#xff0c;它通过加密受害者的数据并要求赎金换取解密密钥&#xff0c;给个人和企业带来了巨大的经济损失。然而&#xff0c;关于安全产品是否真正有效的问题一直存在争议。本文将通过一个模拟实…

pytest+allure

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

如何查看Kafka的偏移量offset

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

pglogical扩展的基本用法介绍

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;14 文档用途 本文翻译了pglogical扩展的官方文档,介绍了pglogical扩展的各类管理函数及使用限制,详情请看下文. 一、节点管理 节点可以使用以下…

前置-Linux相关知识速记

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

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

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