在谷歌上做网站广告要多少钱,给设计网站做图会字体侵权吗,网站编程开发,网站建设中网站需求分析报告功能文章目录 前言一、Elasticsearch倒排索引 二、Docker 搭建 ESDocker 安装Docker 搭建 ES 三、ES基础语法创建索引查看索引删除索引添加数据查询数据修改数据删除数据条件查询分页查询排序 多条件查询andor 范围查询 四、ES在项目中的应用示例 前言 在数据驱动的时代#xff0c… 文章目录 前言一、Elasticsearch倒排索引 二、Docker 搭建 ESDocker 安装Docker 搭建 ES 三、ES基础语法创建索引查看索引删除索引添加数据查询数据修改数据删除数据条件查询分页查询排序 多条件查询andor 范围查询 四、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 信息可能包含以下信息 文档 idDocId, Document Id包含单词的所有文档唯一 id用于去正排索引中查询原始数据。词频TFTerm 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 dockersystemctl enable docker Docker 搭建 ES docker 拉取 elasticsearch镜像 docker pull elasticsearch:7.7.0docker pull docker.elastic.co/elasticsearch/elasticsearch:7.7.0 docker 运行 elasticsearch docker run --name elasticsearch -d -e ES_JAVA_OPTS-Xms512m -Xmx512m -e discovery.typesingle-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 age10 and name张三select * from users where age10 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 age10 or name张三select * from users where age10 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(indexccourse, bodydsl)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(indexccourse,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最大idreturn 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__gtcid)# 数据同步---增量式同步定时同步数据for c in course:es.index(indexccourse, 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_数据同步完成...)