之前的工作关系,需要在手机上支持中文和拼音搜索。由于手机上存储数据一般都是用 sqlite,所以是基于 sqlite3 fts5 来实现。这段时间再次入门 c++,所以想用 c++ 实现一下,一来用于练手,二来当时做的时候发现网络上这方面开源的实现不多,也造福下其他人。

背景

搜索现在几乎是每个 APP 必备的功能,用户已经习惯了搜索框搜一下,避免到处去找。搜索也是帮助用户查找旧信息,发现新功能的一个重要手段。平常我们用微信的时候经常会搜索联系人和聊天记录,发现微信这一块做的还是非常好的。关于微信的全文搜索,可以看看这两篇文章:微信全文搜索优化之路 和 微信移动端的全文检索多音字问题解决方案 。

第一篇文章主要是问题和原理的概述,第二篇文章是核心分词器的实现。我写的这个项目主要是实现了 simple 分词器,并提供一些辅助函数帮助使用。

Simple 分词器

搜索的核心是建倒排索引,建索引的核心是分词器。 跟名字一下,Simple 分词器的规则非常简单:

  1. 空白符跳过
  2. 连续的数字作为整体是一个索引
  3. 连续的英文字母作为整体并转换成小写索引
  4. 中文字单独建索引,并且把中文字转成拼音后也建搜索,这样就能同时支持中文和拼音检索。另外把拼音首字母也建索引,这样搜索 zjl 就能命中 “周杰伦”。
  5. 其他字符统一单独建索引,这样搜索

    Simple: 一个支持中文和拼音搜索的 sqlite fts5插件的更多相关文章

    1. php 字符串截取,支持中文和其他编码

      function.php //使用方法 $content= mb_substr($content,0,25,'utf-8'); /** * 字符串截取,支持中文和其他编码 * @static * @a ...

    2. Sqlite-net 修改版 支持中文和CodeFirst技术

      最近, 做的一个windows 桌面WPF程序, 需要数据库支持.尝试了 sql server 的开发版,使用EF , 效率太低.后来采用sqlite数据库,中间踩坑无数.但最终完美的解决了这些问题. ...

    3. 微信小程序------MD5加密(支持中文和不支持中文)和网络请求(get和post)

      开发中常常遇到MD5加密,最近做小程序也用到了,简单总结了一下: 这要有两个加密文件,一个不支持中文,一个支持,所以你选择支持的来用就行了: 也随便说说小程序的get和post网络请求. 来看看效果图 ...

    4. 仿照微信的效果,实现了一个支持多选、选原图和视频的图片选择器,适配了iOS6-9系统,3行代码即可集成.

      提示:如果你发现了Bug,请尝试更新到最新版.目前最新版是1.6.4,此前的版本或多或少存在一些bug的~如果你已经是最新版了,请留一条评论,我看到了会尽快处理和修复哈~ 关于升级iOS10和Xcdo ...

    5. SQLite中使用全文搜索FTS

      SQLite中使用全文搜索FTS   SQLite支持全文搜索.通过全文搜索功能,可以方便用户快速进行查找.在iOS中,GRDB.FMDB等SQLite框架均支持FTS技术,如FTS3.FTS4等.各 ...

    6. 【Solr】 solr对拼音搜索和拼音首字母搜索的支持

      问:对于拼音和拼音首字母的支持,当你在搜商品的时候,如果想输入拼音和拼音首字母就给出商品的信息,怎么办呢? 实现方式有2种,但是他们其实是对应的.  用lucene实现 1.建索引, 多建一个索引字段 ...

    7. js对页面中的内容进行拼音搜索,只对后台已经传过来的页面数据进行索引

      实现输入拼音(可以使用拼音首字母来查),来查询出已经存在于页面的数据 注意:这种写法只能适用于页面中已经存在的数据进行检索,大体意思是将本页内的数据拼接成一个字符串,然后通过该字符串去检索匹配的字符串 ...

    8. 小米2S 中文和英文支持TWRP,真实双系统支持

      经过我几天的努力小米2S的TWRP 的功能已经完美了. 支持功能 : 中文和英文显示能相互切换 真实双系统功能已经完成95%. 刷入手机方法.由于时间原因我只制作了img文件.没有制作成卡刷包格式. ...

    9. 一个支持种子、磁力、迅雷下载和磁力搜索的APP源代码

      磁力搜索网站2020/01/12更新 https://www.cnblogs.com/cilisousuo/p/12099547.html 一个支持种子.磁力.迅雷下载和磁力搜索的APP源代码 Lic ...

    随机推荐

    1. 001.前端开发知识,前端基础HTML(2020-01-07)

      一.开发工具: chrome . sublime . photoshop 二.Web标准:不是某一个标准,而是由W3C和其他标准化组织制定的一系列标准的集合. 三.HTML的语言语法骨架格式 < ...

    2. 03-Java的基础语法

      一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对象,它的 ...

    3. 《C Prime Plus》第十节笔记

      数组和指针 10.1 数组 10.1.1 初始化数组 标量变量:只储存单个值的变量 创建只读数组,应该用const声明和初始化数组 const int days[] = {1,2,3,5}; 省略方括 ...

    4. 88)PHP,PDOStatement对象

      PDOStatement类,称之为PDO语句对象,SQL执行完(处理完)产生的结果对象. fetchColumn(index=) 允许传递参数,表示获得第一条记录的第几个字段的值. 相当于 getOn ...

    5. fscanf使用心得

      好久没碰C语言了.从现在开始,要开始刷题了. (1)int fscanf( FILE* stream, const char* format, ... ); https://www.programiz ...

    6. 【Vue 学习笔记 一、Vue开发环境搭建】

      搭建Vue的开发环境 1.首先安装Nodejs  (因为我的系统是Windows的所以就选择第一个了,这个看个人的开发环境) 下载好后,然后一路确定,如果有更改安装目录的需求,就自己切换安装目录,由于 ...

    7. XiaoXiao

      最开始认识孙亚龙因为他是we的对手,反向大招的琴女,被冯卓君按在地上摩擦.凭借规则优势去了上海全明星,在红方下外塔和蓝方上二塔那两次q,是他的游戏巅峰.之后他退出了游戏没有再重连,不卖肉松饼是一个承诺 ...

    8. python2查找匹配数据及类型转换

      判断一个字符是否包含在另一个字符串中,如果包含,但是数据类型不同,需要进行数据类型转换 下面这个是针对python2

    9. java面试题 -- 基础

      1.抽象和封装的不同点抽象和封装是互补的概念.一方面,抽象关注对象的行为.另一方面,封装关注对象行为的细节.一般是通过隐藏对象内部状态信息做到封装,因此,封装可以看成是用来提供抽象的一种策略.2.重载 ...

    10. 数据结构中的顺序表和链表(Python语言)

      转载:https://blog.csdn.net/weixin_43187669/article/details/96426362 算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体. ...