之前的工作关系,需要在手机上支持中文和拼音搜索。由于手机上存储数据一般都是用 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. java作业-----方法重载

      满足方法重载的条件:1.方法名相同    2.参数类型不同,参数个数不同,参数类型的顺序不同. 同时,方法的返回值不作为方法重载的判断条件.

    2. Docker系列四: 使用UI管理docker容器

      一.什么是Portainer? Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容 ...

    3. python语法基础-并发编程-线程-长期维护

      ###############   线程和GIL,全局解释器锁    ############## """ 线程 为什么会有进程? 主要是能够同时处理多个任务,多个任务还 ...

    4. springboot学习笔记:12.解决springboot打成可执行jar在linux上启动慢的问题

      有时候,当你把你的springboot项目打成可执行的jar,放在linux上启动时,发现启动超级慢: 这往往是因为springboot内置tomcat启动时实例化SecureRandom对象随机数策 ...

    5. The file named error_log is too large

      The file named errorlog is too large */--> The file named errorlog is too large 1 Problem One day ...

    6. [LC] 159. Longest Substring with At Most Two Distinct Characters

      Given a string s , find the length of the longest substring t  that contains at most 2 distinct char ...

    7. 4)在url中加上a分发参数,用来选哪一个函数

      文件关系目录展示: 然后代码改动部分展示: zixun.controller.class.php <?php //header('Content-type:text/html;charset=u ...

    8. nginx负载均衡如何实现

      什么是nginx?Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的Web和反向代理服务器,也是一个 IMAP/POP3/SMTP ...

    9. 第一次作业:使用java实现word count

      github项目地址: https://github.com/changrui520/homework 作业要求: 可执行程序命名为:wc.exe. 该程序处理用户需求的模式为:wc.exe [par ...

    10. python的collections模块和functools模块

      collections是Python内建的一个集合模块,提供了许多有用的集合类. namedtuple 我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成: >>> ...