elasticsearch 在漫画搜索项目的应用(二)索引设计和管理

索引相当于DB中的表,数据都是储存在索引中。正如数据库的表需要设计索引一样,ES的索引设计同样也有很多要注意的地方,否则就会发生查询速度过慢甚至查询不到数据的情况。本文整理一下自己在设计漫画搜索索引时候遇到的一些问题和细节。

the Index just like Table in DB,the data is stored in the Index.Just like DB tables need to be indexed,the ES index also has pay attaton to many points,Otherwise,the query speed will be slow even the data can not be queried. In this post,I will sort out some of the problems and details I encountered when designing the comic search index.

elasticsearch 在漫画搜索项目的应用(一)安装和部署搜索服务

早期的哔哩哔哩漫画搜索服务是由大数据部门提供的,很多功能上无法满足漫画自己业务的需求。我们在调研了一段时间 elasticsearch(后面简称ES)以后,动手搭建了一套功能齐全的搜索服务。探索的过程收获了不少东西,因此打算写几篇相关的文章记录一下。作为开篇,简单的讲一些ES的搭建过程和一些细节。

The early Bilibili Manga search service is provided by Big Data department,and many functions could not meet the needs of our own business. After a period of investigation, we start to construct a functional search service. We got a lots of exprience in this process so I decide to white some article to record it. As a start, I will go into some details about set up a ES service.

多年 iPhone 用户换 android 手机的前前后后

我的 iPhone 6 plus 用『降频门』+ iOS 11 的 bug + 续航雪崩三连发将我折腾得痛不欲生,在『花一大笔钱升级到新款 iPhone』和『省点钱买个便宜手机』之间犹豫了许久以后,最终还是决定买个便宜的 android 手机。

不过对于稍微有点偏执的我来说,国内的一众『安卓』系统真的无法下手,别扭的 UI,各种『贴心』的优化实在无力吐槽。本想咬牙入手谷歌亲儿子 pixel2,但是网上的一众关于质量问题的报告让我胆战心惊。机缘巧合之下,关于谷歌的『android one』计划和小米的A1 手机印入我的眼帘。

用 force index 调教 MySQL 查询优化器

mysql 有查询优化器,在我们发起一个查询的时候, msql 会尝试分析他,看看是否能做一些优化手段来加快查询速度。最常见的比如说有个 (a,b)的联合索引,无论我们使用SELECT * FROM t WHERE a=? AND b=?还是SELECT * FROM t WHERE b=? AND a=?都能利用到(a,b)这个联合索引,又或者是在很多复杂的查询条件中,分析出使用哪个索引能最大化查询速度,这都是查询优化器做的事情。

然而毕竟程序是死的,有的时候查询优化器并不如我们想象中的那么聪明。这时候就需要我们强制 mysql 按照我们的意愿去查询了。

使用 singleflight 代替传统的并发锁

一般来说高并发,或者 sql 查询很重的业务,缓存都是少不了的。业务代码中,读取缓存的时候一般会这样处理:

data = getCache(key)
if !data {
    data = selectDB(key)
}

但是有些时候光做缓存还是不够,我们还要担心缓存失效导致的集中查 DB 的问题,这时候就需要考虑加锁的问题了。

一个慢查询引发的联合索引的思考

上周开始我司完善了 mysql 慢查询的报警机制,然后很快陆陆续续的一些业务的慢查询报警开始出现了.其中有一个慢查询是对联合索引使用不当引起的,解决这个问题的过程中也让我重新认识了联合索引的特点.

搭建自由的网络环境

对一个程序员来说,能够无障碍的上网是非常重要的,毕竟现在的计算机科学的重心依然在国外.面对越来越严苛的封锁,提高自己的架梯子技术迫在睫眉. 服

通过带缓冲的channel来控制并发数

最近和搜索的同事一起用 golang 重构他们的 Elasticsearch 客户端.在用 Goroutines 去异步更新索引的时候并发量太大导致 ES 进程挂掉的情况(真弱).因此在更新索引的时候考虑如何手动控制并发的协程数量.

博客换新家

我最早接触 静态网站生成器是farbox,在那个不会搭网站的时代,farbox帮助我建成了我的第一个个人博客。如今最流行的静态网站生成器恐怕就

2016年终总结

每年都会有的那个东西.

我是带着一种很复杂的心情来写2016年的总结的.这一年对我来说真的发生了以及认识到了太多的事情
.但是拙劣的文笔却让我很难尽情的通过总结写下来,于是这个总结写着写着心情就变得更差了.

2015年终总结

任何时候都少不了的东西。 职业 2015年是我职业人生很重要的一年,这一年我从一个职场菜鸟转变为了一个小小的技术主力.不是老鸟,也不是老油条,又

从零开始写一个PHP框架

相关代码在这里:github.com/zakokun/myPHP

个人觉得徒手写一个PHP框架是帮助我们了解MVC架构的好办法,同时对PHP的资源调度以及代码组织都是一个很好的锻炼。

设计模式的学习--观察者模式

为了更愉快的装逼,开始学习php的设计模式之二.

特点

  1. 由一个观察者对应多个被观察者,一对多的关系
  2. 被观察者预留update()方法给观察者调用

设计模式的学习--单例模式

为了更愉快的装逼,开始学习php的设计模式.

特点

  1. 一个类有且只有一个实例
  2. 这个实例是由这个类本身创建的
  3. 自行向整个逻辑返回本身的实例

strtr()和str_replace()的区别

工作中遇到了字符串替换的问题,查了一下php中常用的替换函数有strtr()和str_replace().分享一下我自己使用这两个函数的一些心得.

手动实现PHP的方法重载

众所周知,由于弱类型以及特殊的解析方式的原因,PHP本身无法实现方法的重载.但是,通过PHP自带的一些强大的魔术方法,我们可以手动实现方法重载.

php-Redis学习实例

Redis是一个和Memcache类似的NoSQL缓存系统.相比Memcache支持更多的数据类型,并且数据可以持久化,这让他可以储存超过指定内存大小的数据(这是我觉得和Memcache最大的区别).

由于支持的数据格式多,所以操作相比Memcache稍微复杂些.

Redis的各种赋值和取值的操作很多,网上想找个齐全的资料都不太好找.以下整理记录了一些自己常用的操作.

php导出csv文件的一些操作

csv文件本质上是一个由逗号以及回车分割的纯文本文件,因此导出csv文件的流程是: 读取信息->循环拼接成对应格式的字符串->设置

sublime的一些个人使用心得

SubLime Text(ST)是一个很适合程序猿使用的跨平台文本编辑器,有很多强大的内置功能以及丰富的第三方插件.我在第一次接触他的时候就被彻底征服.又大又笨的IDE还是见鬼去吧. 下载安装ST可以直接去官网,有2和3两个版本,ST3目前是beta版,不过日常使用依然是挺稳定的,看个人喜好吧,我用的是2.