dot 快速的未来正在您所在的城市举办的活动中到来。

加入我们参加 Redis 发布会

如何使用 Python 和 RediSearch 构建强大的搜索引擎

虽然 Google 在 搜索引擎 领域占据主导地位,但对于程序员来说,它仍然是一个笨拙的工具,无法访问软件开发中特定于利基的资源。这个社区以有关如何通过不同编程语言部署软件的内容为食,这些内容可以在不同的很棒列表中找到。

Google 通过严格的优化流程对网站进行排名,该流程与有关编程的内容并不完全兼容。这些按需资源被埋藏在 Google 拥挤的图书馆中更深处,这使得程序员更难以访问最有价值的编程内容。

这需要一个能够消除杂乱、识别可在 很棒列表 中找到的深入教程、博客和分步指南的搜索引擎……这就是 Awesome Search 发挥作用的地方。

与 Google 不同,此工具在用途上更具体,而不是更通用,它满足对编程的精选资源的搜索术语,这些资源可能在 Google 上排名不佳。

借助 Redis,该工具得以实现。组件之间的数据传输以闪电般的速度进行,RediSearch 的搜索引擎功能使索引和查询变得高效快捷。

让我们来研究一下 这个 Launchpad 应用程序 是如何做到的。但在继续之前,请务必查看我们在 Launchpad 上的所有其他激动人心的应用程序。

https://www.youtube.com/embed/Hbpb-Y0dXPs
  1. 您将构建什么?
  2. 您需要什么?
  3. 架构
  4. 入门(前端和后端命令)
  5. 工作原理
  6. 结论

1. 您将构建什么?

在此应用程序中,您将构建一个专门用于识别很棒列表上精选内容的搜索引擎。下面我们将按时间顺序依次介绍每个阶段,重点介绍创建此应用程序所需的组件以及每个组件的功能。

什么是很棒列表?

很棒列表是特定利基、应用程序或用例中精选的编码项目的列表。尝试寻找高质量的编程代码一直是一个耗时的过程。很棒列表通过将这些精选的代码项目列表存储在一个区域中来消除此障碍,使程序员更容易访问它们。

2. 您需要什么?

  • RediSearch使用户能够搜索很棒列表上的精选文章
  • Django-redis用于将 Redis 配置为 Django 缓存的后端。
  • Python首选编程语言
  • redis-py 客户端库用作 Redis 键值存储的 Python 接口
  • Redis 队列用于提交新的索引作业
  • Raycast提供一种更灵活的方式来控制工具和安装脚本命令。Raycast 在此应用程序中用作 CLI。

3. 架构

  • 来自不同来源的资源存储在使用 Redis 的各种键和数据类型中。
  • 资源数据存储为 JSON 序列化字符串。
  • django-redis 用于将 Redis 配置为 Django 缓存的后端。这允许使用以下命令整齐地管理 redis-pyredisearch-py 客户端实例的连接
get_redis_connection()
  • CLI 和 Raycast 都查询当前在应用程序引擎上运行的 Django 应用程序
  • 应用程序引擎查询具有 RediSearch 模块的 Redis 实例
  • 数据从 Django 应用程序传输到 Redis 队列以提交新的索引作业

4. 入门

要开始,您需要安装 CLI 和 Raycast。让我们看看这是如何完成的。

先决条件

  • Redis 企业云
  • Google 应用程序引擎(应用程序引擎中的 Django)
  • GitHub 个人访问令牌

步骤 1. 设置 Redis 企业云

转到 /try-free/ 并创建一个新的 Redis 企业云订阅帐户。之后,创建一个新的数据库,选择 RediSearch 作为模块(如下所示)。

数据库设置完毕后,请务必将端点 URL 和凭据保存在安全的地方。

步骤 2. 设置 GitHub 个人访问令牌

在本节中,我们将生成一个可用于访问 GitHub API 的令牌。

您应该采取的下一步是请求 GitHub API 的个人访问令牌 此处

步骤 3. 在 Google 应用程序引擎上部署 Django

有关在应用程序引擎上部署 Django 的详细步骤,请参阅官方 文档

$ gcloud auth login
  1. 选择正确的项目
  2. 启用 Cloud SQL 管理 API
  1. 安装并初始化 Cloud SDK

在 searchapp/ 根目录中。

设置您的项目 ID

$ gcloud config set project <projectname>
  1. 创建一个 MySQL 数据库

然后在部署配置 config.ini 中设置连接字符串/密码。

要部署,请运行

$ gcloud app deploy

要在 Web 浏览器中查看您的应用程序,请执行以下操作

$ gcloud app browse

步骤 4. 克隆存储库

$ git clone https://github.com/redis-developer/awesome-search
$ cd awesome-search

步骤 5. 准备配置文件

% cd searchapp
% cat config.ini
[redis]
PORT=13520
HOST=redis-13520.c276.us-east-1-2.ec2.cloud.redislabs.com
PASSWORD=<add your password>

[github]
ACCESS_TOKEN=<Add your GitHub Personal Access Token here>

[prod]
SECRET_KEY=
MYSQL_NAME=awesome-search-base
MYSQL_USER=root
MYSQL_CONNECTION_NAME=
MYSQL_PASS=

步骤 6. 设置 CLI

创建一个 dist 包。

$ python setup.py sdist

步骤 7. 推送到 PyPi

在推送 Python 包之前,请确保使用 https://pypi.ac.cn/ 创建一个帐户。现在让我们使用以下命令安装 twine Python 模块

$ pip install twine

上传您的 Python 模块

$ twine upload dist/*

您可以使用以下命令直接在本地系统中安装 awesome-search

步骤 8. 安装 awesome-search

您可以使用以下命令直接在本地系统中安装 awesome-search

$ pip install awesome-search

用法

awesome "[query]"

一个搜索示例是搜索“django redis”项目。请务必按星标对结果进行排序。

$ awesome "django redis" -l python -s
awesome "django redis" -l python -sdjango-redis - Full featured redis cache backend for Django.Stars 2053 https://github.com/jazzband/django-redis
django-rq - A simple app that provides django integration for RQ (Redis Queue)Stars 1377 https://github.com/rq/django-rq
django-redis-cache - A Redis cache backend for djangoStars 995 https://github.com/sebleier/django-redis-cache
django-websocket-redis - Websockets for Django applications using Redis as message queueStars 846 https://github.com/jrief/django-websocket-redis
django-redisboard - Redis monitoring and inspection tool in django admin.Stars 228 https://github.com/ionelmc/django-redisboard

选项

以逗号分隔的语言列表。

--languages python,javascript

使用以逗号分隔的术语列表来过滤很棒列表的结果。例如,'redis,django' 用于 awesome-redis, awesome-django。

awesome "django redis" -l python,javascript -sdjango-redis - Full featured redis cache backend for Django.Stars 2053 https://github.com/jazzband/django-redis
django-rq - A simple app that provides django integration for RQ (Redis Queue)Stars 1377 https://github.com/rq/django-rq
django-redis-cache - A Redis cache backend for djangoStars 995 https://github.com/sebleier/django-redis-cache
django-websocket-redis - Websockets for Django applications using Redis as message queueStars 846 https://github.com/jrief/django-websocket-redis
django-redisboard - Redis monitoring and inspection tool in django admin.Stars 228 https://github.com/ionelmc/django-redisboard
--lists [terms]

按星标对结果进行排序。

--stars

要返回的命中次数。

--results 5
awesome "django redis" -l python,javascript -s --stars django-redis - Full featured redis cache backend for Django.Stars 2053 https://github.com/jazzband/django-redis
django-rq - A simple app that provides django integration for RQ (Redis Queue)Stars 1377 https://github.com/rq/django-rq
django-redis-cache - A Redis cache backend for djangoStars 995 https://github.com/sebleier/django-redis-cache
django-websocket-redis - Websockets for Django applications using Redis as message queueStars 846 https://github.com/jrief/django-websocket-redis
django-redisboard - Redis monitoring and inspection tool in django admin.Stars 228 https://github.com/ionelmc/django-redisboard

步骤 9. 如何安装 Raycast

Raycast 是一款软件,它提供了一种更灵活的方式来控制您的工具和安装脚本命令。只需几个按键,您就可以从桌面上的任何位置执行这些命令。

它是一种提高日常任务效率的有效方法,例如转换数据、打开书签和触发开发工作流程。

要添加脚本,请按照 Raycast 脚本命令 页面上的说明操作。

如果您已经为 Raycast 脚本创建了脚本目录,只需将 raycast/awesome_search.py 脚本复制到该目录中。

安装脚本命令

要安装 Raycast,您首先需要安装脚本命令

步骤 1:社区存储库 中选择您的脚本,并将它们保存到一个新目录中。或者,您可以为此使用 _enabled-commands 文件夹。

步骤 2:在 Raycast 首选项中打开“扩展”选项卡

步骤 3:单击加号按钮

步骤 4:添加脚本目录

步骤 5:选择包含您的脚本命令的目录

有用提示:建议您不要直接将社区脚本目录加载到 Raycast 中。这样做是为了避免潜在的重组,并防止新的脚本命令突然出现在 Raycast 中。

工作原理

模式

所有类型的资源都以 resource: 为前缀。这将使您能够灵活地扩展新的资源类型,例如博客。

GitHub 存储库

要跟踪哪些很棒列表出现在存储库列表中,您可以简单地使用一个集合。Redis SADD 命令用于向存储在该键处的集合添加成员。SADD 命令返回添加到集合中的元素数量。这并不包括集合中已存在的元素。

索引内容后,该集合将作为筛选搜索结果的文档属性添加,以便按很棒列表进行筛选。

SADD resource:github:{owner}:{repo_name}:lists {list}
SET resource:github:{owner}:{repo_name} 
{
	'repo_name': resource['name'],
	'lists': # SMEMBERS resource:github:{owner}:{repo_name}:lists
	'body': resource['description'],
	'stargazers_count': resource['stargazers_count'],
	'language': resource['language'],
	'svn_url': resource['svn_url']
}

此外,在插入新资源时,请务必维护一个唯一的很棒列表和语言列表以实现分面搜索。

SADD resource:data:languages {language}
SADD resource:data:awesome_lists {list}

索引

接下来,您需要定义索引。您可以使用 RediSearch 库来定义索引。 

索引

所有存储资源数据的键都以 resource: 为前缀。这使得使用 RediSearch 索引所有我们想要搜索的不同资源类型变得更加容易。 

definition = IndexDefinition(prefix=['resource:'])

作为一种选择,如果只对特定资源(如 Github 仓库)进行索引,则可以指定更具体的 前缀。

prefix=['resource:github']

但是,在进行任何查询之前,需要构建索引。

self.client.create_index([TextField('body', weight=1),
                                      TextField('repo_name', weight=1.5),
                                      TextField('language', weight=1),
                                      TagField('lists')], definition=definition)

这指定了哪些字段应该被索引。此外,weight 参数允许增加某些字段(如“repo_name”)中匹配的效果。

索引创建后,文档会在添加进 Redis 时实时被索引。要向索引添加新文档,只需为该文档创建一个哈希表。

通用搜索

GET /search?query=

对所有资源进行全文搜索。

FT.SEARCH {index} {query}

分面搜索

分面搜索是一种编程技巧,它涉及改进传统的搜索技术。它允许用户通过应用基于项目分面分类的多个过滤器来缩小搜索结果。 

GET /search?query=&source=&language=&awesome-list=

RediSearch 在查询中支持字段修饰符。修饰符可以组合起来对多个字段进行过滤。您可以使用字段修饰符对特定来源、语言和 Awesome 列表实施分面搜索。

FT.SEARCH {index} @resouce:(tweets|github) @language:(Python|C) @awesome_list:(awesome-python) {query}

或者,除了将来源(即推特或 GitHub)指定为字段修饰符之外,还可以通过提供更具体的键前缀为每个来源构建单独的索引。 

definition_git = IndexDefinition(prefix=['resource:github'])
definition_tweet = IndexDefinition(prefix=['resource:tweet'])

拥有独立的索引将导致更快的查询,但也为用户选择跨源搜索时的排名/分页引入了额外的复杂性。 

结论: 连接程序员与高质量内容

谷歌的算法与活跃列表上的资源不兼容,在用户和这些需求量大的内容之间造成了障碍。 但得益于 Redis,Launchpad 应用程序能够创建 Awesome Search,为程序员提供访问宝贵的编码内容,否则这些内容会被埋没在谷歌的库中很深。

虽然每个组件在它的形成过程中都发挥了至关重要的作用,但 RediSearch 能够高效地查找和索引内容的能力是创建强大搜索引擎的关键。如果没有这些元素,构建 Awesome Search 将是不可能的。 

如果您想了解更多关于这个应用程序的信息,请随时在Redis Launchpad 上查看,我们还为您准备了各种各样的应用程序供您探索。  

这个应用程序是谁创建的? 

Marko Arezina

Marko 是一名后端开发专家,目前正在 Shopify 提升自己的技能。 

请务必查看他的 GitHub 简介,以了解他参与的其他活动。