2023年10月29日
摘要: 字符串分割是很常见的功能,通常其实现代码也很简洁,这就使得开发者容易忽略其性能,写出非最佳性能的代码,譬如:没有使用现代 C++ 中的 string_view、对遍历过程没有精细考虑。通过精细的控制计算量以及应用 SIMD 指令可以获得比较好的收益,特别是 SIMD 指令在任意多分隔符场景下性能优化效果非常明显。 阅读全文
posted @ 2023-10-29 22:00 烛秋 阅读(1934) 评论(6) 推荐(10) 编辑
  2019年4月14日
摘要: 本文主要介绍B+树的Copy-On-Write,包括由来、设计思路和核心源码实现(以Xapian源码为例)。中文的互联网世界里,对B树、B+树的科普介绍很丰富,但对它们在工业界的实际使用却几乎没有相关介绍文章,本文既是总结分享,也是资料索引。 在阅读本文之前需要先对B+树有概念上的认识,可以阅读wi 阅读全文
posted @ 2019-04-14 22:58 烛秋 阅读(2771) 评论(0) 推荐(1) 编辑
  2019年3月23日
摘要: 总结今天遇到的一个so库链接、运行问题。 这几天修改了xapian的源码,重新编译so库,再重新编译之前的demo程序,跑起来后却发现执行的函数并非我修改过的,使用的还是老版本。折腾了一会儿,发现是因为/usr/local/lib目录中含有同名so库导致。这里记录下正确的解决思路。 1 确保链接到了 阅读全文
posted @ 2019-03-23 00:25 烛秋 阅读(2130) 评论(0) 推荐(2) 编辑
  2019年3月18日
摘要: 本文属于文档检索过程分析的一部分,重点分析文档匹配百分比(percent)的计算过程。 1 percent是什么? 我们之前分析的检索demo: 2 为什么需要percent? 先说一下背景,做过搜索的人应该都知道BM25算法,这也是xapian内部默认的相关性打分算法,它是一个针对term做打分的 阅读全文
posted @ 2019-03-18 21:03 烛秋 阅读(694) 评论(0) 推荐(0) 编辑
  2019年3月10日
摘要: 本文是Xapian检索过程的分析,本文内容中源码比较多。检索过程,总的来说就是拉取倒排链,取得合法doc,然后做打分排序的过程。 1 理论分析 1.1 检索语法 面对不同的检索业务,我们会有多种检索需求,譬如:要求A term和B term都在Doc中出现;要求A term或者B term任意在Do 阅读全文
posted @ 2019-03-10 23:58 烛秋 阅读(1352) 评论(0) 推荐(0) 编辑
  2019年3月3日
摘要: 本文主要记录Xapian的内存索引在添加文档过程中,做了哪些事情。 内容主要为函数执行过程中的流水线。 demo代码: 1.创建并填充Document 定义好文档对象,使用add_posting接口,添加term,以及对应的position、wdfinc; 内部实现细节: 1.1 先尝试读取doc已 阅读全文
posted @ 2019-03-03 22:16 烛秋 阅读(790) 评论(0) 推荐(0) 编辑
  2019年2月22日
摘要: 关键字:xapian、内存索引 xapian除了提供用于生产环境的磁盘索引,也提供了内存索引(InMemoryDatabase)。内存索引。我们可以通过观察内存索引的设计,来了解xapian的设计思路。 1 用途 官方文档说法: “inmemory, This type is a database 阅读全文
posted @ 2019-02-22 12:49 烛秋 阅读(1140) 评论(0) 推荐(0) 编辑
  2019年2月19日
摘要: 关键字:搜索引擎、Xapian 一篇拖了两三年的入门总结文章,今天发出来,一方面是自己的总结,另一方面是给自己和他人的备忘。读者需要对搜索引擎有初步了解,譬如了解倒排、term、doc、相似度打分等概念。 Xapian是一个C++搜索引擎内核,提供了类似Lucene的功能,功能没有Lucene丰富, 阅读全文
posted @ 2019-02-19 18:52 烛秋 阅读(5839) 评论(1) 推荐(1) 编辑
  2018年12月21日
摘要: 两年未写总结博客,今天先来练练手,总结最近遇到的一个crash case。 注意:以下的分析都基于GCC4.4.6 一、解决crash 我们有一个复杂的排序,涉及到很多个因子,使用自定义排序函数的std::sort做排序。Compare函数类似下文的伪代码: 后来,我们给排序函数加了更多的复杂逻辑: 阅读全文
posted @ 2018-12-21 12:07 烛秋 阅读(4729) 评论(2) 推荐(2) 编辑
  2016年12月25日
摘要: 公司的机器上默认是GCC4.4.6,为了完整的体验C++11,可以自己编译一个GCC4.8.2出来(自带了更高版本的glibc)。 以下是备忘。 1、下载GCC源码以及依赖库 gmp ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.1.tar.bz2 mpfr ftp://ftp 阅读全文
posted @ 2016-12-25 21:58 烛秋 阅读(1963) 评论(2) 推荐(0) 编辑