ES倒排序索引

news2024/9/21 12:40:23

前言

在学习Elasticsearch的使用前,我们先来了解下es是如何实现全文搜索的。

倒排索引是 Elasticsearch 中非常 重要的索引结构,从 文档单词到文档 ID 的过程

为什么要使用倒排索引

先看下面的商品数据goods

id

标题

描述

1

小米手机

小米手机性价比贼高,为发烧而生

2

苹果手机

高端手机,生态丰富

3

三只松鼠零食大礼包

便宜实惠,高端品牌质量有保证

4

小米电脑

小米电脑性价比贼高,便宜好用

如果我们要模糊查含有手机关键词的商品,以mysql查询为例,应该是下面的语句

select * from goods where 标题 like '%手机%' or 描述 like '%手机%'

了解mysql的都知道,用上面的语句查询,索引会失效导致全表查询,如果数据量大的话就会很慢很慢。

怎么解决呢?用倒排索引

倒排索引原理

倒排索引主要包含两个过程:创建倒排索引、倒排索引搜索

创建倒排索引

先对 文档的内容进行分词,形成一个个的 token,也就是 单词,然后保存这些 token 与文档的对应关系。

如上面的商品数据goods,保存后如下所示

token

对应文档

小米

1,4

手机

1,2

苹果

2

电脑

4

三只松鼠

3

零食

3

大礼包

3

便宜

3,4

性价比

1,4

...

...

倒排索引搜索

对搜索词先分词,得到多个Token,然后去倒排索引中进行匹配

如搜索词:性价比手机

分词后:性价比、手机

性价比匹配到的文档是1、4;手机匹配到的文档是1、2

最终搜索到的文档就是1

1

小米手机

小米手机性价比贼高,为发烧而生

实践

简单实现下倒排索引的搜索引擎,中文分词比较麻烦,这里先使用英文,默认英文分词都是空格。

搜索引擎类

class SearchEngines
{
  // 搜索数据
  private $searchData;
  // 搜索
  public function search($keyword)
  {
    // 转小写
    $keyword = strtolower($keyword);
    // 对搜索词进行分词
    $keywords = explode(' ', $keyword);
    $ids = [];
    foreach ($keywords as $keyword) {
      // 查找搜索词对应文档
      $tmpIds = [];
      foreach ($this->searchData[$keyword] as $id) {
        $tmpIds[] = $id;
      }
      // 第一个不取交集
      if (!$ids) {
        $ids = $tmpIds;
        continue;
      }
      // 取搜索词对应文档的交集
      $ids = array_intersect($ids, $tmpIds);
    }
    return $ids;
  }

  // 插入数据
  public function save($id, $keyword)
  {
    // 对关键词进行分词
    $keywords = explode(' ', $keyword);

    foreach ($keywords as $keyword){
      // 都改为小写
      $keyword = strtolower($keyword);
      if (!isset($this->searchData[$keyword])) {
        $this->searchData[$keyword] = [];
      }
      if (!in_array($id, $this->searchData[$keyword])) {
        $this->searchData[$keyword][] = $id;
      }
    }

  }
}

数据插入

$insertData = [
    1 => [
        'id' => 1,
        'title' => 'Xiaomi phones',
        'desc' => 'Xiaomi\'s mobile phone is more cost-effective than thieves, and is born of fever'
    ],
    2 => [
        'id' => 2,
        'title' => 'iPhone',
        'desc' => 'High end mobile phones with rich ecology'
    ],
    3 => [
        'id' => 3,
        'title' => 'Three Squirrels Snack Pack',
        'desc' => 'food'
    ],
    4 => [
        'id' => 4,
        'title' => 'Xiaomi Computer',
        'desc' => 'Xiaomi computers are more cost-effective than thieves, and cheap and easy to use'
    ]
];

$searchEngines = new SearchEngines();
foreach ($insertData as $data) {
    $searchEngines->save($data['id'], $data['title']." ".$data['desc']);
}

关键词搜索

$ids = $searchEngines->search('cost-effective phone');
foreach ($ids as $id) {
  echo $insertData[$id]['title'];
}

执行结果

 

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

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

相关文章

【保姆级】新机器部署Redis

1、登录服务器,如果非root用户则切root用户 sudo su - 2、安装gcc yum install gcc-c 3、在/usr/tmp目录上传redis安装包 4、将安装包移到/opt/byd目录 mv redis-4.0.11.tar.gz /opt/byd 5、解压 & 重命名 tar -xzvf redis-4.0.11.tar.gz mv redis-4.0.11 …

安全狗受邀出席CIS 2022网络安全创新大会

11月16日,由网络安全行业门户Freebuf主办的CIS 2022网络安全创新大会(简称CIS)在上海主会场顺利开幕。 作为国内云原生安全领导厂商,安全狗也收到邀请出席此次活动。 据悉,此次大会分为上海、北京、深圳等多个会场&am…

Pytorch中的DDP

一. 概览 DDP的原理? 在分类上,DDP属于Data Parallel。简单来讲,就是通过提高batch size来增加并行度。为什么快? DDP通过Ring-Reduce的数据交换方法提高了通讯效率,并通过启动多个进程的方式减轻Python GIL的限制&am…

2022-11-17 mysql列存储引擎-聚合运算中间结果缓存磁盘文件以避免OOM-需求分析

摘要: mysql列存储引擎-聚合运算中间结果缓存磁盘文件以避免OOM-需求分析 关联ISSUE: https://github.com/stoneatom/stonedb/issues/21 需求分析ISSUE: https://github.com/stoneatom/stonedb/issues/949 上下文说明: 当前聚合运算的结果都缓存在了内存的HASH中, 一旦数据量…

数据库等值查询与统计信息

概念 统计信息是为优化器的 cost 估算提供数据支撑,其中很重要的一点需求便是等值查询(EQUALS, IN 等) 场景下的基数估算。考虑以下 Case CREATE TABLE mc_tac_template (ID BIGINT ,NAME varchar(50) NOT NULL,GENDER varchar(10) NOT NULL,PRIMARY KEY (ID),KEY K…

工业设计公司的办公环境有哪些特点?

设计公司的办公环境一直被称之为个性化的意味着,见惯了新科技公司的各类智能化豪情万丈的办公环境,也有别于正儿八经办公楼的循规蹈矩,每个设计公司的公司办公室总似一股清流一般的存在,自然各种设计公司,如平面、工业…

Flutter 在项目中使用动画(不使用包)

Flutter 在项目中使用动画(不使用包) 前言 动画对于 web 和移动应用程序都非常重要。但是在移动应用程序中不应该使用夸张的动画。简单但是很多动画使你的应用程序更好用。以至于当你点击一个按钮时,一种平滑的感觉或者页面过渡都会影响到你。 正文 1 按下按钮柔软的…

UNIAPP实战项目笔记39 我的页面布局

UNIAPP实战项目笔记39 我的页面布局 my.vue 我的页面布局 具体图片自己替换哈,随便找了个图片的做示例 代码 pages.json部分 去掉默认导航栏,改为自定义导航栏 ,{"path" : "pages/my/my","style" : …

408 | 【数据结构】 排序 —— 总复习框架总结

(一)排序的基本概念 排序算法的稳定性:经过排序后,能使关键字相同的元素保持原顺序中的相对位置不变。 (二)内部排序 2.1、插入排序 算法思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。 2.1.1、直接插入排序 顺…

通过Xamarin实现东大集成PDA的扫码

目录1、东大集成PDA的扫码说明2、Xamarin通过广播实现扫码2.1 PDA的扫码工具设置2.2 代码实现2.2.1 主界面2.2.1 定义广播接收器2.2.2 在活动页面实现读取2.3 实现效果3、demo下载1、东大集成PDA的扫码说明 东大集成的PDA有两种方式实现设备自带的扫码功能。一种为调用硬件接口…

终极大招~pycharm自动补全opencv代码提示功能

你的pycharm还能自动补全opencv代码提示吗? 你可能通过修改cv2,进入__init__.py文件,一顿操作,还是不行。 你以为是工具问题,卸载重装? 还是opencv卸载重装好几次了 这次分享下我的方案,保证你一看就会。…

人工智能数学基础--概率与统计10:离散随机变量的概率函数及常见的二项分布、泊松分布

一、离散随机变量的概率函数及分布函数 设X为离散随机变量,其全部可能取值为{a1,a2,…},则:piP(Xai) &nsp&nsp&nsp&nsp (i1,2,…)称为X的概率函数,也称为随机变量X的概率分布; 设X为随机变量&#xf…

【lombok】equals相等返回false contains包含返回false? lombok注解的一个天坑

最近在写代码的时候 遇到个奇怪的问题 使用 list.contains(obj) 方法判断&#xff0c;明明是两个内容一样的对象&#xff0c;却返回了false 这里用伪代码还原一下场景&#xff1a; // 从数据库取的所有数据 List<SysMenuDTO> allList getDataFromDB(); // 一个id等于1…

【Detectron2】代码库学习-3. LazyConfig 配置文件

目录1. 配置文件2. LazyConfig 导入导出3. 递归实例化4. 基于LazyConfig的训练步骤4.1 导入依赖库4.2 日志初始化4.3 训练4.4 评估4.5 训练流程4.6 主函数入口5. TipsDetectron2是Facebook AI Research(FAIR)推出的基于Pytorch的视觉算法开源框架&#xff0c;主要聚焦于目标检测…

进程的通信 - 邮槽

邮槽 邮槽是Windows系统提供的一种单向进程间的通信机制。对于相对简短的地坪率信息发送&#xff0c;使用邮槽通常比命名管道或者Unix域套接字更简单 使用邮槽通信的进程分为服务端和客户端。邮槽由服务端创建&#xff0c;在创建时需要指定邮槽名&#xff0c;创建后服务端得…

PIC单片机-测试例程汇总

内容包括PIC单片机常用外设的测试例程。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易&#xff01;目录&#xff1a;一、端口的定义与while(1)的使用二、延时1、通过语句延时程序&#xff08;带参数&#xff09; 2、通过语句延时程序&…

N3-PEG-NHS,Azide-PEG-NHS,叠氮-聚乙二醇-活性酯可用来修饰蛋白质

一、详情介绍 1、名称 英文&#xff1a;N3-PEG-NHS&#xff0c;Azide-PEG-NHS 中文&#xff1a;叠氮-聚乙二醇-活性酯 2、描述 Azide-PEG-NHS的分子量&#xff1a;Azide-PEG-NHS 1k&#xff0c;叠氮-聚乙二醇-活性酯 2k&#xff0c;叠氮-PEG-活性酯 5k&#xff0c;N3-PEG-…

rr来debug你的C/C++程序(Linux)

如何用rr来debug你的C/C程序(Linux) 想象一下如果你的程序某时会崩溃&#xff0c;但是不能稳定复现&#xff0c;你会如何debug它? 用传统debugger面临的问题就是你不知道这次运行的时候能不能复现&#xff0c;你猜测可能某段代码出现了问题&#xff0c;所以进行了一番检查。…

柔性制造物料抓取及加工系统设计

目 录 摘 要 I Abstract II 1 绪论 1 1.1 选题背景及意义 1 1.2 国内外研究现状 2 1.3六自由度并联机器人介绍 3 1.4研究主要内容 6 1.4.1主要设计要求 6 1.4.2技术参数 7 2柔性制造物料抓取及加工系统的结构及工作原理 8 2.1 并联运动机构概述 8 2.2 六自由度并联加工机器人总…

LTR (Learning to Rank): 排序算法 poitwise, pairwise, listwise常见方案总结

目录1 Learing to Rank介绍2 The Pointwise Approach3 The Pairwise Approach3.1 RankNet4 The Listwise Approach4.1 直接优化评测指标4.1.1 LambdaRank4.1.2 LambdaMART4.2 定义Listwise损失函数4.2.1 ListNet4.2.2 ListMLE5 排序评估指标5.1 Mean Reciprocal Rank (MRR)5.2 …