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

微信全文搜索优化之路

所以,微信会把所有的群成员拼接为单个字符串,插入搜索DB中。 热数据延迟更新: 针对更新频率非常高的热数据,采用延迟更新的策略。所有的索引数据分为正常数据和脏数据。...这个分词规则的原因主要是在微信对全文搜索的结果排序需求主要是其他的属性排序,并非依据文档的相关性排序。即,全文搜索部分只需要找到存在关键词的文档,并不关心文档中存在几个关键词。...在移动端由于屏幕的限制,往往在最后显示搜索结果时,只会高亮少量命中的关键词,而Offsets函数会计算命中Doc中所有目标词语偏移,所以需要对Offsets函数进行改造。...减少总体循环次数 减少取数据阶段的总体循环次数,比较容易想到的就是在SQL层做数据的分页返回,分页返回就意味着需要在DB层排序,在DB层排序的决定因素就是排序因子。...但是微信全文搜索面对的业务排序因子多并且复杂,无法直接使用SQL中的ORDER BY,所以需要通过一个中间函数转化,把所有的排序因子通过一个可比较的数字体现,最后再使用ORDER BY排序。

1.8K20

微信全文搜索优化之路

所以,微信会把所有的群成员拼接为单个字符串,插入搜索DB中。 热数据延迟更新: 针对更新频率非常高的热数据,采用延迟更新的策略。所有的索引数据分为正常数据和脏数据。...这个分词规则的原因主要是在微信对全文搜索的结果排序需求主要是其他的属性排序,并非依据文档的相关性排序。即,全文搜索部分只需要找到存在关键词的文档,并不关心文档中存在几个关键词。...在移动端由于屏幕的限制,往往在最后显示搜索结果时,只会高亮少量命中的关键词,而Offsets函数会计算命中Doc中所有目标词语偏移,所以需要对Offsets函数进行改造。...减少总体循环次数 减少取数据阶段的总体循环次数,比较容易想到的就是在SQL层做数据的分页返回,分页返回就意味着需要在DB层排序,在DB层排序的决定因素就是排序因子。...但是微信全文搜索面对的业务排序因子多并且复杂,无法直接使用SQL中的ORDER BY,所以需要通过一个中间函数转化,把所有的排序因子通过一个可比较的数字体现,最后再使用ORDER BY排序。

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

    移动客户端中高效使用 SQLite

    SQLite 在进行搜索的时候会先根据索引表i1找到对应的行,再根据 rowid 去原表中获取 b 列对应的数据。可能有些工程师已经发现了,这里可以优化啊,没必要找到一行数据后还要去原表找一次。...如果对于排序列没有建索引,可以想象 SQLite 内部会对结果进行一次排序。实际上如果对没有建索引,SQLite 会建一棵临时 B Tree 来进行排序。 ?...如果 App 对于字符串搜索有要求,那么基本上 LIKE 是满足不了要求的。 FTS 是 SQLite 为加快字符串搜索而创建的虚拟表。...FTS 不仅能通过分词大大加快英文类字符串的搜索,对于中文字符串 FTS 配合 ICU 也能对中文等其他语言进行分词、分字处理,加快这些语言的搜索速度。...我们一般会用字符串在原始表中的行号作为这里的 docid。 如果你仔细看搜索语句你会发现和官方文档不太一样的是,对于 MATCH 的结果我们会再用 LIKE 过滤一次。

    5.5K70

    数据结构练手小项目(AVL树、哈希表、循环链表、MySQL数据库)

    3.客户数据应组织为AVL搜索树,并按“护照号”排序。...6.客户发行或退回SIM卡的数据必须包含 护照号码-一行,其格式对应于客户数据中的相似行; SIM卡号-格式对应于SIM卡中数据中类似行的行; 发布日期-字符串; 到期日期-字符串。...因此,可能存在在其字段中具有重复值的数据。 7.客户SIM卡的发行或归还数据应以循环链表的形式进行组织,并按主键“ SIM卡号”的顺序进行排列。 列表视图和排序方法由作业选项确定。...搜索结果-有关找到的SIM卡的所有信息,以及该SIM卡发给的客户的姓名和护照号码;(哈希表主键搜索+AVL树主键搜索) 向客户发行SIM卡的注册。...3.客户数据应组织为AVL搜索树,并按“护照号”排序。

    1.2K30

    【测试SQLite】测试SQLite支持的SQL语句分类

    instr(X,Y):在字符串 X 中查找字符串 Y 的第一个出现,并返回先前字符的数量加 1,如果 Y 在 X 中没有找到,则返回 0。...多参数 max() 函数从左到右搜索其参数以查找定义排序函数的参数,并使用该排序函数进行所有字符串比较。如果 max() 的参数没有一个定义排序函数,则使用 BINARY 排序函数。...min(X,Y,…):多参数 min() 函数返回具有最小值的参数。多参数 min() 函数从左到右搜索其参数以查找定义排序函数的参数,并使用该排序函数进行所有字符串比较。...nullif(X,Y) 函数从左到右搜索其参数以查找定义排序函数,并使用该排序函数进行所有字符串比较。如果 nullif() 的两个参数都没有定义排序函数,则使用 BINARY 排序函数。...如果REINDEX关键字后面跟着一个排序序列名称,那么会重新创建所有使用该命名排序序列的所有附加数据库中的索引。

    36500

    统计文件中出现的单词次数

    该操作块是在文件输入之前执行的,也就是不需要输入任何文件数据,也能执行该模块。 BEGIN模块常用于设置修改内置变量如(OFS,RS,FS等),为用户自定义的变量赋初始值或者打印标题信息等。...,并把次数打印在每行前端 NF: 浏览记录的域的个数 例如; 搜索统计单词"kevin"的个数 [root@centos6-test06 ~]# awk -F : '/kevin/{count++}...利用管道组成的一条命令) 写一个shell脚本,查找kevin.txt文本中n个出现频率最高的单词,输出结果需要显示单词出现的次数,并按照次数从大到小排序。...分为以下几步: 1)将文本文件以一行一个单词的形式显示出来; 2)将单词中的大写字母转化成小写字母,即Word和word认为一个单词; 3)对单词进行排序; 4)对排序好的单词列表统计每个单词出现的次数...uniq -c | #删除文本文件中重复出现的行,-c在每列旁边显示该行重复出现的次数 sort -k1nr -k2

    3.8K111

    微信手机端的本地数据全文检索优化之路

    所以,微信会把所有的群成员拼接为单个字符串,插入搜索DB中。 热数据延迟更新: 针对更新频率非常高的热数据,采用延迟更新的策略。所有的索引数据分为正常数据和脏数据。...在移动端由于屏幕的限制,往往在最后显示搜索结果时,只会高亮少量命中的关键词,而Offsets函数会计算命中Doc中所有目标词语偏移,所以需要对Offsets函数进行改造。...优化2:减少总体循环次数 减少取数据阶段的总体循环次数,比较容易想到的就是在SQL层做数据的分页返回,分页返回就意味着需要在DB层排序,在DB层排序的决定因素就是排序因子。...但是微信全文搜索面对的业务排序因子多并且复杂,无法直接使用SQL中的ORDER BY,所以需要通过一个中间函数转化,把所有的排序因子通过一个可比较的数字体现,最后再使用ORDER BY排序。...此方案通过Group By在SQL层直接统计出命中聊天记录的个数,并按照最近的时间排序。

    2.7K20

    Sqlite3详细解读

    在经济管理的日常工作中,常常需要把某些相关的数据放进这样的“仓库”,并根据管理的需要进行相应的处理。...使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。...@SQL 标准规定,在字符串中,单引号需要使用逃逸字符,即在一行中使用两个单引号。 @INTEGER PRIMARY KEY属性,有什么特性?...该键值在当前的表中是唯一的。但有可能与已从表中删除的值重叠。要想建立在整个表的生命周期中唯一的键值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT声明。...,其它的自己查SQL文档。相同的通配符在同一个SQL声明中出现多次, 在这种情况下所有相同的通配符都会被替换成相应的值. 没有被绑定的通配符将自动取NULL值。

    3.7K10

    Python for Everything

    dir(object):可以看出该对象有什么方法 type(object):对象的类型 str.find('a'): 查找第一个a字符串 .upper() 全部大写 .lower() 全部小写 ....lstrip() .rstrip() .strip():去掉左右空格 .split() 对字符串进行切片 dic.get(list()/str(),0):在dic中,把属于list中的所有key的keyvalue...()):可以对dic的key进行排序输出 sorted([(v,k)for k,v in dicObj.items()]) 字典转成数组排序 import re 引入正则表达式库 re.search(...,【[^ ]】查找非零字符串(【^】就是非的意思),把第一串找出来 $[0-9.]+ :从【$】开始,把数字和小数点查找出来 符号 功能 ^ 匹配一行的开头 $ 匹配线的末尾 ....重复一次或多次角色(非贪婪) [AEIOU] 匹配列出的集合中的单个字符 [^ XYZ] 匹配不在列出的集合中的单个字符 [A-Z0-9] 字符集可以包括范围 ( 指示字符串提取的开始位置 ) 指示字符串提取结束的位置

    65020

    日拱一卒,伯克利教你学SQL,量大管饱

    首先,在SQLite3中加载表: sqlite3 --init lab12.sql 在我们开始之前,检查我们为你提供的表的schema: sqlite> .schema 这会告诉我们当前有的表名,以及它的属性...当你进行join时,SQLite将会匹配两张表的每一行。所以不要让一个人和他自己匹配,或者是同一个匹配出现两次。...通过select出number和count(*),我们可以得到出现次数最多的number以及它被选择的次数。...所以我们就选出了出现次数最大的top 10 Q7: Let's Count 让我们来做一些有趣的事,对于接下来的每一个查询,我们都为它在lab12_extra.sql中创建了表。...编写一个SQL查询,使用count聚合来创建一张表,将smallest和它出现的次数存储下来。

    95620

    如何管理SQL数据库

    在本指南中,给出的示例数据值都包含在撇号(')中。在SQL中,必须在撇号中包装由字符串组成的任何数据值。数字数据不需要这样做,但如果包含撇号,也不会导致任何问题。...注意:如果您未在UPDATE语句中包含WHERE子句,该命令将替换表中每行中保存的数据。...以下查询语法返回来自column_1和column_2的值,并按升序保存的值对column_1中的结果进行排序,或者对于字符串值,按字母顺序对结果进行排序: SELECT column_1, column...table ORDER BY column_1 DESC; 使用GROUP BY子句对结果进行排序 该GROUP BY子句是类似于ORDER BY子句,但它是用来包括聚合函数例如查询的结果进行排序COUNT...INNER JOIN将返回两个表中具有匹配值的所有记录,但不会显示任何没有匹配值的记录。 通过使用外部 JOIN子句,可以从两个表中的一个表中返回所有记录,包括在另一个表中没有相应匹配的值。

    5.5K95

    最全的ios系统导出微信聊天记录&生成词云教程

    在左侧的表中,所有以”Chat_”开头的表就是单人聊天记录或群聊或公众号的聊天记录。以”ChatExt2_”开头的表是没有用的。...在左侧最下面找到一个名为”sqlite_sequence”的表,点开看到该表的内容是name-seq的关系表,其中name就是左侧全部的表名,seq是与这个人互发消息的总条数,点击”seq”列名的地方可以对...第4行是执行获取所有表名的SQL语句,如果需要遍历全部聊天记录可以使用该语句。 第5行是第二步中找到的表名。 第6行是从该表中查询所有的消息记录。...,这张图片中所有白色的区域都不会有词云出现。...在本示例中,我使用的是如下的图片: 最后一行把生成的词云写入文件。

    3.6K20

    大厂面试系列(七):数据结构与算法等

    先跟面试官说了思路,然后又在白纸上写了出来 对一个数组进行绝对值排序的算法; 非降序数组,打印某个值最后出现的位置 找出数组中超过半数的那个数字(摩尔投票) 一个数组反转,o(logn)复杂度用什么排序算法...不用类库函数,对这两个数组排序。 给定一个数组,求该数组所有的自子数组 去掉一个字符串中的所有空格 给定一个数组,元素的大小0~25,有重复元素。...JDK1.8采用的红黑树特性,以及采用红黑树的理由而不采用AVL和B树的原因? 一个二叉搜索树,找出某两个节点的公共祖先。 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。...此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。...,每一行从上往下增大,求一个指定的数字在这个数组中的位置 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

    1.2K20

    高级查询(化繁为简、分页提升性能)

    第二个例子稍微复杂一些,首先对key进行精确查询,找到了就返回,若是没找到,则开启模糊查询。 这里遇到了等于、包含、区间等判断操作,后面会详解所有支持的操作。...高级分页 两个例子都出现了一个PageParameter参数page,这是分页参数,包含分页查询以及排序所需要的数据。 ?...100万行以上数据表,如若不带条件或者条件没有命中索引,select count 将会极其的慢,在1000万以上甚至查不出来,这是XCode能对100亿表进行分页查询的关键所在。 ?...Meta.Count 的初始值来自于数据库元数据索引表,里面有该表主键的总行数,取得该值后如果小于100万再异步select count一次。...10多年前博客园ORM大战的时候,我们常说,等你支持千万级分页的时候再来比,就是钻了select count很慢的这个空子,很多人count出来总数再分页 ^_^ 上图4亿数据,查询第10000页,在SQLite

    1.3K20

    使用iOS原生sqlite3框架对sqlite数据库进行操作

    在iOS的原生开发框架中可以对sqlite数据库进行很好的支持,这个框架中采用C风格且通过指针移动进行数据的操作,使用起来有些不便,我们可以对一些数据库的常用操作进行一些面向对象的封装。...1.面向对象的sqlite管理类的设计思路         为了便于使用,在设计时,我们尽量将libsqlite3中的方法不暴漏在使用层,通过面向应用的接口来进行方法的设计,设计思路类图如下: ?... 如果已经存在 会返回错误信息  *  *  @param name 表的名称  *  *  @prarm dic 表中的键 其中字典中需传入 键名:类型  类型的宏定义在YHBaseSQLTypeHeader.h... tableName 表名  *  *  @param orderKey 进行排序的键值 可以为nil 则不排序  *  *  @param type 排序方式 在YHBaseSQLTypeHeader...表里所有age列大于18的数据,并按照age从小到大进行排序,数据结果在回调的dataArray中。

    2.2K10

    Lucene基本知识入门

    全文检索 计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当用户查询时,检索程序就根据实现建立的索引进行查找,并将查找的结果反馈给用户的检索方式。...按照字母顺序排序后,可以得到每个词元在每个文档中出现的频率。将每个词信息合并,并按照频率倒序排序,可以得到倒排链表。...影响一个词在一片文档中重要性的关键因素: Term Frequency (tf):某个词在某篇文档中出现的次数;TF 值越大,说明该词越重要; 可以理解为:一个词在某篇文档中出现的次数很多,说明该文档就是讲这方面的问题的...Document Frequency (df):所有文档中,某个词在多少文档中出现过;DF 值越大,说明该词越不重要; 例如:this 在很多文档中出现,但它并不重要。...比如计算一个共有 11 个词的查询语句,共有三篇文档搜索出来,首先计算所有词的权重,然后根据打分公式分别计算查询语句与三篇文档的相关性。最后按照相关性进行排序,即可得到最想要的文档。

    88010

    全面&详细的面试指南:数据结构与算法篇 (附答案)

    1.4 核心学习内容 主要包括: 排序 线性表:数组、链表、栈与队列 树:含特殊的树,如二叉树、红黑树等 串:如字符串 查找 图 在后面的章节中,我会详细介绍上述数据结构。 2. 算法是什么?...算法应用 最简单的排序算法:冒泡排序 数据量大时最该选择的算法:简单选择排序 不可不了解的排序算法:直接插入排序 复杂度最高的排序算法:希尔排序 数据量大时最该选择的算法:简单选择排序 内存占用最少的排序算法...1.2 算法应用 典型应用1:寻找出现特定次数的数字 数组中只出现1次的2个数字 数组中出现次数超过一半的数字 统计 数字在排序数组中出现的次数:二分法 数组中唯一出现1次的数字、其他都出现了3次 典型应用...3:不同类型数组的查找 二维数组中的查找 找出旋转数组的最小数字 典型应用4:数组内元素的排列组合 数组所有滑动窗口的最大值 连续子数组的最大和 把数组的所有数排成最小的数:大数问题 数组中的逆序对 调整数组顺序...算法应用 典型应用1:字符串转换 把数字翻译成字符串 把字符串转换成整数 典型应用2:字符查找 第一个只出现一次的字符、字符流中第1个只出现1次的字符、删除1个字符串中的重复字符、删除2个字符串中的重复字符

    88720

    Python小白的数据库入门

    与Excel不同的是,数据库提供了快速的、高效的编程接口,可以让我们非常简洁、灵活的以代码去操作这个数据库,例如删除一条数据、新增一条数据、对数据进行排序,就想我们经常对价格、销量、好评排序那样。...DDL和DML是最常用的语言,是重中之重,其他两种忽略 SQLite 数据库 SQLite 是一款轻型的嵌入式数据库,占用资源及其低,这是它受人青睐的原因之一,在嵌入式设备(如手机)中只需要几百 K 的内存即可...因为一个人既可以在学生表中,也可以在班干部表中。如果我们在班干部表中查到了他的学号,那么就可以用这个学号再去全体学生表中查出他的全部信息,包括考试成绩等等这些,这就是所谓的多表查询。...Python中的SQLite 操作SQLite 操作该数据库的大致步骤就是连接数据库,然后对数据库进行增删改查等操作即可。...从结果中取出所有结果,返回所有结果的列表 close() 关闭游标 查询返回的一行数据是一个元组,如上面代码中,print(row),其中row是一个元组,通过row[0]、row[1]等访问每一列数据

    2K30

    iOS微信全文搜索技术优化

    ,联系人搜索甚至用的是内存搜索(在内存中遍历所有联系人的所有属性进行匹配)。...(rowid)、列号和字段中的每次出现的位置偏移,所以这个segment就是该内容的倒排索引。...根据非文本搜索内容的不同存储位置,我们可以将FTS索引表的表格式分成两种: 第一种方式是将非文本搜索内容存储在额外的普通表中,这个表保存FTS索引的Rowid和非文本搜索内容的映射关系,而FTS索引表的每一行只保存可搜索的文本内容...,然后汇总各个表的搜索结果,再进行统一排序。...因为FTS5不支持建立联合索引,所以在使用OrderBy子句时,SQLite在输出第一个结果前会遍历所有匹配结果进行排序,这就让输出第一个结果的耗时几乎等于输出全部结果的耗时,中断逻辑就失去了意义。

    2.5K60
    领券