IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> es geo实现同城短视频列表 -> 正文阅读

[大数据]es geo实现同城短视频列表

需求

根据定位找出所有的同城发布的短视频;展示展示如下:

  1. 海量视频;
  2. 不能刷出重复视频
    在这里插入图片描述

实现

  1. 用es 的geo 实现同城数据搜索
  2. 根据es scroll 优化深度分页问题
  3. 用redis 的bitmap 实现数据过滤
es map 创建

在帖子index map 添加location 字段用于geo 搜索
常见mapping

'posts_index' => [
        'settings' => [
            'refresh_interval' => '5s',
            'number_of_shards' => 3,
            'number_of_replicas' => 0,
        ],
        'mappings' => [
            'properties' => [
                'id' => [
                    'type' => 'long',
                ],
                ...
                'location' => [
                    "type" => "geo_point"
                ],
                ...
            ],
        ]
    ],
es scroll 查询
  1. 根据地理位置搜索同城信息
$query = [
            'bool' => [
                'must'     => [
                    [
                        'term' => [
                            'city_code' => $cityCode,
                        ],
                    ],
                    ...
                ],
                'must_not' => [
                    [
                        'term' => [
                            'user_id' => $userId,
                        ],
                    ],
                ],
                "filter"   => [
                    "geo_distance" => [
                        "distance" => "200km",
                        "location" => [
                            "lat" => (float)$lat,
                            "lon" => (float)$lon,
                        ],
                    ],
                ],
            ],
        ];

        $sort   = [
            "_geo_distance" => [
                "location" => [
                    "lat" => (float)$lat,
                    "lon" => (float)$lon,
                ],
                "order"    => "asc",
                "unit"     => "km",
            ],
        ];
        $option = ['scroll' => '5m']; //快照时间

 self::find()->query($query)->limit($limit)->orderBy($sort)->createCommand()->search($option);

第二次后根据返回的scroll_id 请求es,获取快照信息

 $url   = ['_search', 'scroll'];
        $query = [
            "scroll"    => "5m",
            "scroll_id" => $scoreId,
        ];
self::getDb()->get($url, [], json_encode($query));
redis bitmap 过滤重复数据

1.把帖子id 作为移动下标

$this->redis()->setbit($this->bucket, $id, 1);

2.根据帖子id 判断是否存在

$bit = $this->redis()->getbit($this->bucket, $id);

总结

  1. 如果是忠实用户会出现大量的已读的中间数据,目前只是重复取相关数据然后去重,因有预加载暂时不影响用户体验
  2. 对于一点的考虑,如果真要实现过滤功能,需要考虑实现一个用户一份全量数据的设计,但是目前我们是因为帖子数据较少通过去重来提高用户体验,后期数据量大后考虑不需要去重,添加随机因子来排序
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:22:23  更:2022-10-22 21:25:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 -2025/4/22 12:19:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码