如何使用 Headless CMS 实现站点搜索功能:ES 和 Algolia 实践
随着现代 Web 开发的不断发展,越来越多的网站和应用需要集成搜索功能。对于传统的 CMS 来说,搜索是一个比较基本的功能,但是对于 Headless CMS 这样的无前端 CMS 来说,如何实现搜索功能就成了一个比较大的挑战。本文将介绍如何使用 ES 和 Algolia 实现站点搜索功能,并包含示例代码供大家参考。
一、ES 实现站点搜索功能
Elasticsearch 是一个分布式开源搜索和分析引擎,由于其强大的搜索和分析功能,被越来越多的企业和网站所采用。下面将介绍如何使用 ElasticSearch 来实现 Headless CMS 的站点搜索功能。
- 前置条件
首先,我们需要准备好以下工具和环境:
- ElasticSearch:建议使用版本为 7.x 及以上
- elasticsearch-dsl:帮助我们更方便地使用 ElasticSearch API 的 Python 库
- Python3 环境
- Headless CMS:我们将以 Strapi CMS 为例演示搜索功能
- 建立索引
首先,我们需要将 CMS 中的数据建立索引,以便可以进行搜索。索引建立的主要步骤如下:
- 创建索引
- 定义索引映射,即定义文档格式
- 存储数据
下面是一个简单的例子,演示如何使用 elasticsearch-dsl 库来创建一个 ElasticSearch 索引:
-- -------------------- ---- ------- ---- ----------------- ------ --------- ----- -------- ------- ---- ----------------------------- ------ ----------- ----- ------------------ ----- - ----------------------- ----------- ------- - ------ -------- - ----------------------- ----------- --- - ----------------------- ----------- ------ - ----------------------- ----------- -- - --------- ----- ------ ---- - --------------- -------- - - ------------------- -- --------------------- - -
上述代码定义了一个名为 “article_index” 的索引,包含了 title、content、category、tag、author 和 id 六个字段,其中 title、category、tag 和 author 字段定义为 keyword 类型。在上述代码中,我们使用了 elasticsearch-dsl 提供的一些高级特性,如 fields 属性和 Index 类。其中 fields 属性用于指定 Text 类型的子属性,以便把一个字段同时存储为 text 和 keyword 类型,方便后面的搜索。Index 类用于指定索引名称和一些自定义的索引属性,如此处指定了 shard 和 replica 数量。
下面是代码演示如何像 Elasticsearch 中添加一篇文章的数据:
-- -------------------- ---- ------- ---- ---- ------ ------- -------------------------------------------------- ----------- -------- - -------- ------------ ------- ------------- -- -- ----- --------- ---------------- ------------- ------------- ---- - ---------------
上述代码中,我们使用了之前定义的 Article 类来处理数据存储和索引操作,使用 save() 方法将文章持久化到 Elasticsearch 中。
- 搜索数据
接下来就是搜索数据的步骤了。我们可以使用各种查询方式来搜索数据,如全文搜索、精确搜索、聚合查询等。下面是使用 elasticsearch-dsl 实现的一个简单的全文搜索:
-- -------------------- ---- ------- ---- ----------------- ------ ------ -------------------------------------------------- ----------- - - ----------------------------- - --------------------- -------------- ---------------- ----------- -------- - ----------- --- --- -- ------------------- ----------------------------
上述代码表示搜索 article_index 索引中的 title 和 content 字段,包含字符串 “world” 的文档。具体实现方式是使用 Search 类来构造查询对象,然后执行 execute() 函数来获取返回结果。结果将会是一个包含匹配的文档的列表。
二、Algolia 实现站点搜索功能
Algolia 是一个全托管的搜索解决方案,为企业和小型团队提供搜索和发现服务。它可以帮助开发者在短时间内完成搜索功能的开发,提供了优秀的搜索性能和搜索体验。下面将介绍如何使用 Algolia 来实现 Headless CMS 的站点搜索功能。
- 注册 Algolia 账号
首先,我们需要在 Algolia 官网注册一个账号,并创建一个应用程序。然后,我们需要在应用程序中创建一个索引来存储数据,并获取 API key 用于后续操作。
- 安装依赖
接下来,我们需要在项目中安装 Algolia 的 Python SDK。在 Terminal 中输入以下命令即可:
pip install algoliasearch
- 导入数据
Algolia 适用于结构化数据的搜索,因此我们需要把原始数据转换成可以被搜索的结构化数据格式。通常我们会使用一个叫做 record-helper 的工具来处理数据,具体使用方式请参考 Algolia 的官方文档。
下面是代码演示如何把 Headless CMS 中的 Article 数据转换为 Algolia 可用的数据格式:
-- -------------------- ---- ------- ------ ------------- ---- ------------- ------ --------------------------- ------ - ------------------------------------- --------- ----- - --------------------------------- -------- - - --------- ------ ------- ---------- ----- -- -- ----- --------- ----------- ------- ------ --------- --------- ------ ----- --- --------- ------------- -- ---- ---------- ----- -- -- ------------ ------- ----- ----- ----------- ------------- ------ ----- --------- ------- ----- -- - - -- -------- ----- -------- - ------------------------------------- - ---- ---------------------------- ---------------------------------- ------
上述代码中,我们使用 Algolia 为我们提供的 Client 类来初始化客户端,并通过 init_index() 方法创建了一个名为 “articl_index” 的索引。然后,我们把 CMS 中的 Article 数据转换为 Algolia 中可用的 JSON 格式,并导入到 “articl_index” 索引中。
- 搜索数据
最后,我们需要编写代码来搜索数据。Algolia 提供了丰富的查询功能,如全文搜索、模糊搜索、前缀匹配、精确匹配等。下面是一个使用 Algolia 实现的全文搜索示例:
-- -------------------- ---- ------- ------ ------------- ------ - ------------------------------------- --------- ----- - --------------------------------- ----- - ------- ------- - ------------------- - ---- --- --- -- ---------------- ----------
上述代码中,我们使用了 Algolia 提供的 Python SDK 客户端来构造查询对象,然后通过 search() 函数发起请求,并打印返回结果。
总结
本文分别介绍了使用 ElasticSearch 和 Algolia 实现站点搜索功能的方法和步骤,并提供了具体示例代码供大家参考。在实践 Headless CMS 的开发中,使用现成的搜索解决方案是一个比较好的选择,可以节约开发时间和提高搜索性能。不过,对于更为复杂的搜索需求,也可以使用 Elasticsearch 进行二次开发,从而满足更多的业务需求。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ad108848841e9894936bc7