使用ElasticSearch搭建动态排序引擎

2020-05-27 00:00:00 排序 动态 希望 热度 妹子

本来打算至少一月一更的,结果写完篇后爆忙了一段时间(眼神死)...

在这个专栏里,我不会翻译官方文档。所有关于ES本身的介绍,推荐直接看英文版官方文档,或者google之。ES本身以惊人的速度在迭代,现在的中文材料很容易就跟不上新版的节奏。特别是5.0出来之后,会有非常大的变化。

在这个专栏里,我会根据自己的实战经验,写一下Elastic Search全家桶(官方自称为Elastic Stack)的应用。从年初到现在,我个人也从ES吹,到ES与Sphinx混用,到了自造轮子的阶段。ES很好用,也有坑;ES不仅仅是一个搜索引擎,配合其全家桶,可以干更多事情。我相信,告诉大家ES可以用来干嘛,比起搬运文档要更有价值。

第二篇文章,准备写一下Elastic Search的一个经典、简单的应用场景:动态排序引擎

举个例子,现在你做了一个UGC图床产品,需要将用户新PO的图按某种顺序(例如时间或热度)排序展示出来。用户发了图之后,在“新”那一页一刷新,就能看到他/她刚发的图,然后可以一直往下翻。图片可能存在不同的TAG(例如“妹子图”、“无聊图”,甚至做二级的细分)。等等,我才不是在说某网站呢,这是个很常见的需求好么!

如果你用MySQL来实现这个需求,可以是可以。不过,随着图片数量和查询请求的增加,很快就会出现性能瓶颈,产生大量的慢查询。你需要一个高性能动态排序引擎,有以下的功能:

• 动态索引,即可以随时增删查改条目;

• 排序,输入from和size(从哪到哪),根据某个数值(热度或插入时间戳),倒序排序、输出结果;

• Filter,例如根据TAG筛选图片;

假定图片是先存MySQL、再同步去ES。用MySQL存数据和保证原子性,用ES来顶查询请求。在ES里面,你可以这么设计索引结构:

{
    "properties": {
        "id": {
            "type": "long"
        },
        "tags": {
            "type": "string"
        },
        "hot": {
            "type": "double"
        },
        "new": {
            "type": "double"
        },
        "update_time": {
            "type": "date",
            "format": "epoch_second"
        },
        "is_searchable": {
            "type": "short"
        }
    }
}

相关文章