首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

检索技术核心 笔记

01 | 线性结构检索:从数组和链表的原理初窥检索本质 数组和链表分别代表了连续空间和不连续空间的最基础的存储方式,它们是线性表(Linear List)的典型代表。...毕竟如果我们要在有序的数组中插入一个元素,为了保证“数组有序”,我们就需要将数组中排在这个元素后面的元素,全部顺序后移一位,这其实是一个 O(n) 的时间代价了。...03 | 哈希检索:如何根据用户ID快速查询用户信息?...04 | 状态检索:如何快速判断一个用户是否存在? 直接使用 ID 作为数组下标会有一个问题:如果 ID 的范围比较广,比如说在 10 万之内,那我们就需要保证数组的长度大于 10 万。...05 | 倒排索引:如何从海量数据中查询同时带有“极”和“客”的唐诗? 一个以对象的唯一 ID 为 key 的哈希索引结构,叫作正排索引(Forward Index).

80020

《自制搜索引擎》笔记

1-6 使用倒排索引进行检索 使用倒排索引的检索处理流程 ① 获取查询中每个单词的倒排列表; ② 根据布尔检索,获取符合检索条件的文档编号; ③ ’ 计算符合检索条件的文档和查询的匹配度;...③ ” 获取对检索结果进行排序时使用的属性值; ④ 根据匹配度或用于排序的属性值,获取前 k 个文档。...,用该类型的别名 inverted_ index_value 表示关联数组中的一个元素。...于是,就经常可以看到在存储 倒排索引前,对其进行压缩以减少从二级存储读取的时间,进而使检索 处理得以高速运转的对策。...该函数会先从倒排列表的各元素中取出文档编号、位置信息 的数量以及位置信息的数组,然后再将这些数据以二进制的形式写入缓冲区。

2.5K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    海量数据处理 算法总结

    我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征,找到正确的链表,再从链表中找出这个元素。 元素特征转变为数组下标的方法就是散列法。...这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。   ...VSM检索模型 VSM全称是Vector Space Model(向量空间模型),是IR(Information Retrieval信息检索)模型中的一种,由于其简单,直观,高效,所以被广泛的应用到搜索引擎的架构中...有没有发现,倒排表建立好以后,就不需要在检索整个文档库,而是直接从字典集合中找到“中国”和“移动”,然后遍历后面的列表直接计算。...有经验的码农都知道,一般在系统的“做加法”的代价比“做减法”的代价要低很多,在搜索引擎中中也不例外。因此,在倒排表中,遇到要删除一个文档,其实不是真正的删除,而是将其标记删除。

    76510

    入门 | 海量数据处理算法总结【超详解】

    Bloom Filter的缺点: 1)Bloom Filter无法从Bloom Filter集合中删除一个元素。因为该元素对应的位会牵动到其他的元素。...我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征,找到正确的链表,再从链表中找出这个元素。 元素特征转变为数组下标的方法就是散列法。...这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。...【VSM检索模型】 VSM全称是Vector Space Model(向量空间模型),是IR(Information Retrieval信息检索)模型中的一种,由于其简单,直观,高效,所以被广泛的应用到搜索引擎的架构中...有没有发现,倒排表建立好以后,就不需要在检索整个文档库,而是直接从字典集合中找到“中国”和“移动”,然后遍历后面的列表直接计算。

    1.9K90

    用了 Elasticsearch 后,查询起飞了!

    关于搜索 先设想一个关于搜索的场景,假设我们要搜索一首诗句内容中带“前”字的古诗。 用传统关系型数据库和 ES 实现会有什么差别?...在 ES 中,这些被描述为所有包含特定 term 文档的 id 的集合。...在每一个 segment 里面都会保存最多 2^31 个文档,每个文档被分配一个唯一的 id,从 0 到 (2^31)-1。 相关的名词都是 ES 官方文档给的描述,后面参考材料中都可以找到出处。...比如现在有 id 列表 [73, 300, 302, 332, 343, 372],转化成每一个 id 相对于前一个 id 的增量值(第一个 id 的前一个 id 默认是 0,增量就是它自己)列表是 [...对高位进行聚合 (以高位做 key,value 为有相同高位的所有低位数组),根据低位的数据量 (不同高位聚合出的低位数组长度不相同),使用不同的 container(数据结构) 存储。

    39530

    Elasticsearch 倒排索引的秘密

    2 关于搜索 先设想一个关于搜索的场景,假设我们要搜索一首诗句内容中带“前”字的古诗, 用 传统关系型数据库和 ES 实现会有什么差别?...在 ES 中,这些被描述为所有包含特定 term 文档的 id 的集合。...在每一个 segment 里面都会保存最多 2^31 个文档,每个文档被分配一个唯一的 id,从0到(2^31)-1。 相关的名词都是 ES 官方文档给的描述,后面参考材料中都可以找到出处。 2....比如现在有 id 列表 [73, 300, 302, 332, 343, 372],转化成每一个 id 相对于前一个 id 的增量值(第一个 id 的前一个 id 默认是 0,增量就是它自己)列表是[73...对高位进行聚合 (以高位做 key,value 为有相同高位的所有低位数组),根据低位的数据量 (不同高位聚合出的低位数组长度不相同),使用不同的 container(数据结构) 存储。

    44730

    Elasticsearch 为什么能做到快速检索?— 倒排索引的秘密

    二、关于搜索 先设想一个关于搜索的场景,假设我们要搜索一首诗句内容中带“前”字的古诗, 用传统关系型数据库和 ES 实现会有什么差别?...在 ES 中,这些被描述为所有包含特定 term 文档的 id 的集合。...在每一个 segment 里面都会保存最多 2^31 个文档,每个文档被分配一个唯一的 id,从0到(2^31)-1。 相关的名词都是 ES 官方文档给的描述,后面参考材料中都可以找到出处。 2....比如现在有 id 列表 [73, 300, 302, 332, 343, 372],转化成每一个 id 相对于前一个 id 的增量值(第一个 id 的前一个 id 默认是 0,增量就是它自己)列表是[73...对高位进行聚合 (以高位做 key,value 为有相同高位的所有低位数组),根据低位的数据量 (不同高位聚合出的低位数组长度不相同),使用不同的 container(数据结构) 存储。

    46420

    Elasticsearch 如何做到快速检索?和 MySQL 索引完全不同!

    - 关于搜索 - 先设想一个关于搜索的场景,假设我们要搜索一首诗句内容中带“前”字的古诗。 用传统关系型数据库和 ES 实现会有什么差别?...在 ES 中,这些被描述为所有包含特定 term 文档的 id 的集合。...在每一个 segment 里面都会保存最多 2^31 个文档,每个文档被分配一个唯一的 id,从 0 到 (2^31)-1。...比如现在有 id 列表 [73, 300, 302, 332, 343, 372],转化成每一个 id 相对于前一个 id 的增量值(第一个 id 的前一个 id 默认是 0,增量就是它自己)列表是 [...对高位进行聚合 (以高位做 key,value 为有相同高位的所有低位数组),根据低位的数据量 (不同高位聚合出的低位数组长度不相同),使用不同的 container(数据结构) 存储。

    71920

    Elasticsearch 为什么能做到快速检索?

    二、关于搜索 先设想一个关于搜索的场景,假设我们要搜索一首诗句内容中带“前”字的古诗, 用传统关系型数据库和 ES 实现会有什么差别?...在 ES 中,这些被描述为所有包含特定 term 文档的 id 的集合。...在每一个 segment 里面都会保存最多 2^31 个文档,每个文档被分配一个唯一的 id,从0到(2^31)-1。 相关的名词都是 ES 官方文档给的描述,后面参考材料中都可以找到出处。 2....比如现在有 id 列表 [73, 300, 302, 332, 343, 372],转化成每一个 id 相对于前一个 id 的增量值(第一个 id 的前一个 id 默认是 0,增量就是它自己)列表是[73...对高位进行聚合 (以高位做 key,value 为有相同高位的所有低位数组),根据低位的数据量 (不同高位聚合出的低位数组长度不相同),使用不同的 container(数据结构) 存储。

    1.1K20

    ElasticSearch权威指南:基础入门(中)

    hits ,它 包含 total 字段来表示匹配到的文档总数,并且一个 hits 数组包含所查询结果的前十个文档。...在 hits 数组中每个结果包含文档的 _index 、 _type 、 _id ,加上 _source 字段。这意味着我们可以直接从返回的搜索结果中使用整个文档。...多索引、多类型 如果不对某一特殊的索引或者类型做限制,就会搜索集群中的所有文档。Elasticsearch 转发搜索请求到每一个主分片或者副本分片,汇集查询出的前10个结果,并且返回给我们。...分页 在之前的 空搜索 中说明了集群中有 14 个文档匹配了(empty)query 。 但是在 hits 数组中只有 10 个文档。如何才能看到其他的文档?...当你从 Elasticsearch 得到一个文档,每个数组的顺序和你当初索引文档时一样。你得到的 _source 域,包含与你索引的一模一样的 JSON 文档。

    6.3K41

    全文检索的极致之选:Elasticsearch完全指南

    WordId(单词 ID):文本检索时要根据查询词来匹配文档中的单词,WordId 就是将单词映射为数字 ID,以便进行快速匹配。...需要注意的是,文档矩阵可能非常庞大,因此一般会使用稀疏矩阵来存储,以节省存储空间和计算资源。稀疏矩阵只存储非零元素,将零值的单元格从矩阵中删除。...倒排索引的数据结构通常包括以下三个主要部分: 单词词项表(Term Dictionary):单词词项表存储了所有文档中出现过的单词以及它们在倒排索引数组中的位置信息。...以上就是 FOR 算法的概念,总结一下: (1)数组元素值为与前一位的差值 V(n)=V(n)-V(n-1),n=2,3,4… (2)计算数组中最大值所需占用的大小 (3)计算数组是否需要拆分...索引数据的生成:在对文档进行分析后,Elasticsearch 会根据文档 ID、分析结果等信息生成相应的索引数据,并将其存储在内存中的缓冲区中。

    1K10

    【翻译】MongoDB指南CRUD操作(一)

    下面的例子演示了向集合users 中插入三个文档,每个文档都有三个字段:name, age,和status,因为文档没有指定_id字段,MongoDB会添加一个值为ObjectIds 的_id字段。...使用数组索引匹配嵌入式文档中的一个字段 如果知道数组中待检索嵌入式文档的索引,可使用圆点操作符和嵌入式文档位置指定嵌入式文档。...例如,检索满足下列条件的所有文档:points 数组中的第一个元素为嵌入式文档,points 为此嵌入式文档中的字段,points值小于等于55。...例如,找出满足下列条件的所有文档:points 中的数组字段满足复合检索条件。...例如,从users 集合中检索字段status 的值为“A”的文档。

    5.5K90

    Faiss: 入门导读

    引言 Faiss是Facebook于2017年开源的一个相似度检索工具。 相似度检索是啥?搜索、广告、推荐都需要用到相似度的检索。...然后 xb[:, 0] 表示的是对二维数组切片。 这个方括号里冒号逗号分隔,可以视作三个参数: 参数1和参数2表示的选择的行范围。用法类型list的切片,只是这里选择的是行。...index.add(xb) xb是前面用numpy生成的随机二维数组(一组向量),将其添加到索引中。 或者可以说成是给xb构建了一个索引。...每一行有4个元素(因为k=4)。从左到右表示距离从近到远。元素的值是xb中的向量的id。 返回值:D D表示的就是计算出来的距离。...因为真实的相似检索过程,输入数据可不是文档集合的xb[:5],而是另外一组向量。 比如用户看完一篇文章,要推荐其他文章给用户。

    61810

    干掉 SQL 中的 like,我用 es 后,小姐姐们都说好快!

    2 关于搜索 先设想一个关于搜索的场景,假设我们要搜索一首诗句内容中带“前”字的古诗, 用 传统关系型数据库和 ES 实现会有什么差别?...在 ES 中,这些被描述为所有包含特定 term 文档的 id 的集合。...在每一个 segment 里面都会保存最多 2^31 个文档,每个文档被分配一个唯一的 id,从0到(2^31)-1。 相关的名词都是 ES 官方文档给的描述,后面参考材料中都可以找到出处。 2....比如现在有 id 列表 [73, 300, 302, 332, 343, 372],转化成每一个 id 相对于前一个 id 的增量值(第一个 id 的前一个 id 默认是 0,增量就是它自己)列表是[73...对高位进行聚合 (以高位做 key,value 为有相同高位的所有低位数组),根据低位的数据量 (不同高位聚合出的低位数组长度不相同),使用不同的 container(数据结构) 存储。

    45020

    Elasticsearch 如何做到快速检索 - 倒排索引的秘密

    二、关于搜索 先设想一个关于搜索的场景,假设我们要搜索一首诗句内容中带“前”字的古诗, 用 传统关系型数据库和 ES 实现会有什么差别?...在 ES 中,这些被描述为所有包含特定 term 文档的 id 的集合。...在每一个 segment 里面都会保存最多 2^31 个文档,每个文档被分配一个唯一的 id,从0到(2^31)-1。 相关的名词都是 ES 官方文档给的描述,后面参考材料中都可以找到出处。 2....比如现在有 id 列表 [73, 300, 302, 332, 343, 372],转化成每一个 id 相对于前一个 id 的增量值(第一个 id 的前一个 id 默认是 0,增量就是它自己)列表是[73...对高位进行聚合 (以高位做 key,value 为有相同高位的所有低位数组),根据低位的数据量 (不同高位聚合出的低位数组长度不相同),使用不同的 container(数据结构) 存储。

    1.8K20

    玩转MongoDB: 索引,速度的引领

    stage(查询的类型):无索引是COLLSCAN(全表扫描);有索引是FETCH+IXSCAN(索引扫描+根据索引去检索指定document)。...四、稀疏索引 唯一索引会把null看作值,所以无法将多个缺少唯一索引中的键的文档插入到集合中。然而,在有些情况下,你可能希望唯一索引只对包含相应键的文档生效。...一、全文索引 mongoDB有一个特殊的索引用在文档中搜索文本,之前的博客都是用精确匹配来查询字符串,这些技术有一定的限制。在搜索大块文本的速度非常慢,而且无法处理自然语言礼节的问题。...如果用在球体表面上,在极点附近会出现大量的扭曲变形。 文档中应该使用包含两个元素的数组表示2d索引字段。...矩形,可以指定$box选项($box接受一个两元素的数组,第一个元素指定左下角的坐标,第二个元素指定右上角的坐标): db.gameMapinfo.find({"tile":{"$within":{"$

    1.6K40

    玩转MongoDB: 索引,速度的引领

    stage(查询的类型):无索引是COLLSCAN(全表扫描);有索引是FETCH+IXSCAN(索引扫描+根据索引去检索指定document)。...四、稀疏索引 唯一索引会把null看作值,所以无法将多个缺少唯一索引中的键的文档插入到集合中。然而,在有些情况下,你可能希望唯一索引只对包含相应键的文档生效。...一、全文索引 mongoDB有一个特殊的索引用在文档中搜索文本,之前的博客都是用精确匹配来查询字符串,这些技术有一定的限制。在搜索大块文本的速度非常慢,而且无法处理自然语言礼节的问题。...如果用在球体表面上,在极点附近会出现大量的扭曲变形。 文档中应该使用包含两个元素的数组表示2d索引字段。...矩形,可以指定$box选项($box接受一个两元素的数组,第一个元素指定左下角的坐标,第二个元素指定右上角的坐标): db.gameMapinfo.find({"tile":{"$within":{"$

    70330

    可搜索加密:基础知识

    2.布隆过滤器(BF) Bloom filter:主要用于检索一个元素是否在一个集合中,1970年由布隆提出,它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数)。...6.词频-逆文档频度(TF-IDF) 词频-逆文档频度(Term Frequency - Inverse Document Frequency)是一种用于信息检索与文本挖掘的常用加权技术,用来评估一个词对于一个文档集或语料库中某个文档的重要程度...9.Top-k检索 旨在获取相似度后,将其作为打分结果,根据匹配到的文件的分数,按照顺序返回给用户分数排名最高的K份数据,是搜索引擎中最常见的模式。简而言之,就是使用户快速找到最相关的 k 个结果。...在PRP中,存在一个有效算法,能够实现 K × X → X 映射关系,也就是说该算法能够将随机密钥 K 与集合 X 中的元素作为输入,同时输出值也是集合 X 中的元素,那么就要求每个元素一一对应。...从本质上来说,E(K,X) 是对元素 x 的置换,为了解密的需要,就要求 E 是可逆的。

    1.9K62

    前端开发JavaScript-巩固你的JavaScript

    ,并返回新的长度 valueOf() 返回数组对象的原始值 indexOf() 在数组中搜索指定元素并返回第一个匹配的索引 lastIndexOf() 在数组中搜索指定元素并返回最后一个匹配的索引...splice方法,从指定位置插入指定个数的元素。 concat方法将多个数组连接成一个数组。 join方法将数组中的元素合并成一个用指定分隔符合并起来的字符串。...indexOf(),indexOf(搜索词,起始索引位置),第2个参数不写则默认从0开始搜索。indexOf()用于检索指定的字符串值在字符串中首次出现的位置。...lastIndexOf(),lastIndexOf(搜索词,起始索引位置),从后向前检索,返回的是一个指定的子字符串值最后出现的位置。...正则对象方法 RegExp对象方法 属性 说明 test() 用于检测一个字符串是否匹配某个模式 exec() 该方法用于检索字符串中的正则表达式的匹配,该函数返回一个数组 [a-z] 匹配小写字母从

    2.9K60

    【思维导图】前端开发JavaScript-巩固你的JavaScript知识体系

    ,并返回新的长度 valueOf() 返回数组对象的原始值 indexOf() 在数组中搜索指定元素并返回第一个匹配的索引 lastIndexOf() 在数组中搜索指定元素并返回最后一个匹配的索引...splice方法,从指定位置插入指定个数的元素。 concat方法将多个数组连接成一个数组。 join方法将数组中的元素合并成一个用指定分隔符合并起来的字符串。...indexOf(),indexOf(搜索词,起始索引位置),第2个参数不写则默认从0开始搜索。indexOf()用于检索指定的字符串值在字符串中首次出现的位置。...lastIndexOf(),lastIndexOf(搜索词,起始索引位置),从后向前检索,返回的是一个指定的子字符串值最后出现的位置。...正则对象方法 RegExp对象方法 属性 说明 test() 用于检测一个字符串是否匹配某个模式 exec() 该方法用于检索字符串中的正则表达式的匹配,该函数返回一个数组 [a-z] 匹配小写字母从

    3.2K20
    领券