虽然 Google 在搜索引擎领域占据主导地位,但对于程序员来说,访问软件开发方面特定领域的资源仍然是一个麻烦的工具。 这个社区通过不同的编程语言来部署软件的内容提供信息,这些内容可以在不同的优秀列表中找到。
Google 通过严格的优化流程对网站进行排名,该流程与有关编程的内容并不完全兼容。 这些热门资源深埋在 Google 拥挤的库中,这使得程序员更难访问最有价值的编程内容。
这就需要一个搜索引擎来消除混乱,识别可以在 awesome lists 上找到的深入教程、博客和循序渐进的指南……这就是 Awesome Search 发挥作用的地方。
与 Google 不同,此工具的目的比一般搜索更具体,它满足了对编程精选资源的需求,这些资源在 Google 上可能排名不佳。
感谢 Redis,这个工具才得以实现。 组件之间的数据传输以闪电般的速度进行,RediSearch 的搜索引擎功能使索引和查询变得非常高效。
让我们来研究一下 这个 Launchpad 应用是如何完成的。 但在我们继续之前,请务必查看我们在 Launchpad 上的所有其他精彩应用程序。
在此应用程序中,您将构建一个专门用于识别 awesome lists 上精选内容的搜索引擎。 下面我们将按时间顺序介绍每个阶段,重点介绍创建此应用程序所需的组件,并解开每个组件的功能。
awesome list 是特定领域、应用程序或用例中的精选编码项目列表。 尝试查找高质量的编程代码一直是一个耗时的过程。 Awesome lists 通过将这些精选的代码项目列表存储在一个区域中来消除此障碍,从而使程序员更容易访问它们。
get_redis_connection()
要开始使用,您必须安装 CLI 和 Raycast。 让我们看看这是如何完成的。
先决条件
转到 /try-free/ 并创建一个新的 Redis Enterprise Cloud 订阅帐户。 之后,创建一个新数据库,选择 RediSearch 作为模块(如下所示)。
设置数据库后,请务必将端点 URL 和凭据保存在安全的地方。
在本节中,我们将生成一个可用于访问 GitHub API 的令牌。
您应该采取的下一步是为 Github API 在此处 请求个人访问令牌。
有关在 App Engine 上部署 Django 的详细步骤,请参阅官方文档。
$ gcloud auth login
在 searchapp/ 根目录中。
设置您的项目 ID
$ gcloud config set project <projectname>
然后在部署 config.ini 中设置连接字符串/密码。
$ gcloud app deploy
$ gcloud app browse
$ git clone https://github.com/redis-developer/awesome-search
$ cd awesome-search
% 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=
创建一个 dist 包。
$ python setup.py sdist
在推送 Python 包之前,请务必在 https://pypi.ac.cn/ 上创建一个帐户。 现在让我们使用以下命令安装 twine Python 模块
$ pip install twine
上传您的 Python 模块
$ twine upload dist/*
您可以使用以下命令在本地系统中直接安装 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
使用以逗号分隔的术语列表来过滤 awesome lists 结果。 例如,awesome-redis,awesome-django 使用“redis,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: 前缀。 这将使您可以灵活地扩展新的资源类型,例如博客。
要跟踪哪些 awesome lists 出现在存储库列表中,您可以简单地使用一个集合。 Redis SADD 命令用于将成员添加到存储在键中的集合。 SADD 命令返回添加到集合的元素数量。 这不包括集合中已存在的所有元素。
索引内容后,该集合将添加为文档属性,用于按 awesome list 过滤搜索结果。
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 支持查询中的字段修饰符。 可以组合修饰符以实现对多个字段的过滤。 您可以使用字段修饰符在特定来源、语言和优秀列表上实现分面搜索。
FT.SEARCH {index} @resouce:(tweets|github) @language:(Python|C) @awesome_list:(awesome-python) {query}
或者,可以为每个来源构建单独的索引,而不是将来源(即 tweet 或 GitHub)指定为字段修饰符,方法是提供更具体的键前缀。
definition_git = IndexDefinition(prefix=['resource:github'])
definition_tweet = IndexDefinition(prefix=['resource:tweet'])
拥有单独的索引将导致更快的查询,如果用户选择跨多个来源进行搜索,也会增加排名/分页的复杂性。
Google 的算法与活动列表上的资源不兼容,这在用户和有需求的此内容之间造成了障碍。 但多亏了 Redis,这个 Launchpad 应用程序才能够创建 Awesome Search,为程序员提供访问宝贵编码内容的机会,否则这些内容将被埋没在 Google 的库中。
虽然每个组件在其形成过程中都发挥了关键作用,但 RediSearch 以极高的效率查找和索引内容的能力是创建强大搜索引擎的关键。 没有这些元素,构建 Awesome Search 将是不可能的。
如果您想了解更多关于此应用程序的信息,请随时在 Redis Launchpad 上查看,在那里我们还有各种不同的应用程序供您发现。
Marko Arezina
Marko 是后端开发专家,目前正在使用 Shopify 磨练自己的技能。
请务必 查看他的 GitHub 个人资料,了解他参与的其他活动。