首页 > 其他分享 >Elasticsearch在项目中的使用

Elasticsearch在项目中的使用

时间:2023-08-14 22:25:09浏览次数:29  
标签:项目 使用 10100 查询 索引 Elasticsearch 分片 2.3 节点

一.mysql和es的比较

1.mysql适合存储海量的数据,但是某些情况下的查询效率过低。

正常可以通过添加索引等加快查询速度,但是模糊查询的时候效率很低,会触发全局扫描

SELECT * FROM product WHERE title like '%优惠券%' 

2.基于 Lucene 引擎构建的开源分布式搜索分析引擎,可以提供针对 PB 数据的近实时查询,广泛用在全文检索、日志分析、监控分析等场景

主要使用了倒排索引来加快查询速度。

a.查询fury的文档,使用正排索引需要全局扫描,然后挨个比较查找是否有这个单词。

b.使用倒排索引,查询到fury需要2次,一次定位到两个id,再根据id确认具体数据

 3.es是分布式架构,

一个 ES 集群由多个 node 节点组成,每个 index 是以分片(Shard,index 子集)的数据存在于多个 node 节点上的。

这样的话当一个查询请求进来,分别在各个 node 查询相应的结果并整合后即可,将查询压力分散到多个节点,避免了单个节点 CPU,磁盘,内存等处理能力的不足。

另外当新节点加入后,会自动迁移部分分片至新节点,实现负载均衡,这个功能是 ES 自动完成的,是使用zookeeper实现

ZooKeeper 能够在 Elasticsearch 集群中实现以下功能:

  1. 节点发现:它允许节点发现其他节点的存在,并与它们通信。

  2. 节点管理:它允许管理员在不影响其他节点的情况下对节点进行管理。

  3. 集群状态管理:它允许集群状态的变化被快速检测和响应。

二.项目中的实际应用

背景:需要对每天百万以上的数据进行利润的分类,前端需要按照分类进行分页查询。

分类的字段是一个字段,一个订单可能对应到多个分类,若优惠券,异常件,因此前端使用的是模糊匹配,在mysql中查询效率会很低。

而且数据一般可以查询到仅3个月内数据,按照每天百万来说,数据量也接近1亿。

2.1 使用from+size分页

from + size大于10000的时候,就会出现问题

2.2 深度分页

分布式数据库不同于单机数据库,数据是被分散保存在每个分片中的,无法保证要查询的这一百位学员的成绩一定都在某一个分片中,结果很有可能是存在于每个分片。换句话说,你从任意一个分片中取出的前10100位学员的成绩,都不一定是总成绩的前10100。更不幸的是,唯一的解决办法是从每个分片中取出当前分片的前10100名学员成绩,然后汇总成50500条数据再次排序,然后从排序后的这50500个成绩中查询前10100的成绩,此时才能保证一定是整个索引中的成绩的前10100名。

实际上需要进行两次排序,先从各自的分片中找出10100,然后在堆内存中进行二次排序,若是深度更大,容易造成oom的问题,因此设置max_result_window为10000。

2.3解决方案

2.3.1 避免深度分页,取消跳页,只能下一页点击

2.3.2 Scroll Search

2.3.3 Search After


引用

https://www.51cto.com/article/656071.html

https://blog.csdn.net/wlei0618/article/details/120800632

 

标签:项目,使用,10100,查询,索引,Elasticsearch,分片,2.3,节点
From: https://www.cnblogs.com/developS/p/17629921.html

相关文章

  • 知识付费到底使用哪个平台好,网课平台兔知云课堂源码
    知识付费平台分成两类。一类是学浪就是抖音的亲儿子,还有一类是所谓的第三方小程序平台,大多数的老师呢还是选择学浪,有的老师没办法入住,一些课程我们选择第三方平台。那么这两个到底有什么样的区别,或者优缺点呢?我们来对比一下。首先雪浪的优点呢就是首先是免费,另外课程录好之后,我......
  • 如何在工作中利用Prompt高效使用ChatGPT?
    导读AI不是来替代你的,是来帮助你更好工作。用betterprompt使用chatgpt,替换搜索引擎,让你了解如何在工作中利用Prompt高效使用ChatGPT。01背景现在GPT已经开启了人工智能狂潮,不过是IT圈,还是金融圈。一开始,我觉的它就是一个增强版搜索引擎,在使用了一段时间之后,才发现它......
  • c++20 format基本使用
    下面代码是一个使用format的例子#include<iostream>#include<cmath>#include<format>intmain(){doubleprincipal{1000};doublerate{0.5};std::cout<<std::format("Initialprincipal:{:>7.2f}\n",principal);......
  • 在树莓派上使用Dockers运行Openwrt并作为主路由器的旁路由
    开启网卡混杂模式sudoiplinkseteth0promiscon首先需要新建一个/etc/rc.local并添加可执行权限sudotouch/etc/rc.localsudochmod+x/etc/rc.local内容如下:#!/bin/sh-e#/etc/rc.local##rc.local##Thisscriptisexecutedattheendofeachmultiuserrunlevel......
  • 使用 JScript 查找操作系统名称/版本
    varwbemFlagReturnImmediately=0x10;varwbemFlagForwardOnly=0x20;varobjWMIService=GetObject("winmgmts:\\\\.\\root\\CIMV2");varcolItems=objWMIService.ExecQuery("SELECT*FROMWin32_OperatingSystem","WQL",......
  • Java 日志系列:JUL 使用和原理分析
    目录一、简介二、使用三、日志级别四、Logger继承关系五、配置文件六、原理解析一、简介JUL全称JavautilLogging是java原生的日志框架,使用时不需要另外引用第三方类库,相对其他日志框架使用方便,学习简单,能够在小型应用中灵活使用。Loggers:被称为记录器,应用程序通过获......
  • 项目创建及依赖
    pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://mav......
  • MySQL 使用表的自联结,lag,lead得到该行记录所在连续段长度
    目录题目地址代码题目地址https://leetcode.cn/problems/human-traffic-of-stadium/description/代码##WriteyourMySQLquerystatementbelow##本质上就是连续签到问题呗#SELECTVersion()#8.0.33,用户变量编程用不了witht1as(SELECT*fromstadium......
  • NLP文本匹配任务Text Matching 有监督训练:PointWise(单塔)、DSSM(双塔)、Sentence BERT(双
    NLP文本匹配任务TextMatching[无监督训练]:SimCSE、ESimCSE、DiffCSE项目实践文本匹配多用于计算两个文本之间的相似度,该示例会基于ESimCSE实现一个无监督的文本匹配模型的训练流程。文本匹配多用于计算两段「自然文本」之间的「相似度」。例如,在搜索引擎中,我们通常需要判断......
  • 抽象类在项目中的实际应用
    一.抽象类和接口的区别?1.接⼝的⽅方法默认是public,所有⽅方法在接⼝口中不不能有实现(Java8开始接⼝口⽅方法可以有默认实现),⽽而抽象类可以有⾮非抽象的⽅方法。2.接⼝口中除了了static、final变量量,不不能有其他变量量,⽽而抽象类中则不不⼀一定。3.⼀一个类可以实现多个接⼝口,但......