如何使用 Headless CMS 实现站点搜索功能:ES 和 Algolia 实践

阅读时长 8 分钟读完

如何使用 Headless CMS 实现站点搜索功能:ES 和 Algolia 实践

随着现代 Web 开发的不断发展,越来越多的网站和应用需要集成搜索功能。对于传统的 CMS 来说,搜索是一个比较基本的功能,但是对于 Headless CMS 这样的无前端 CMS 来说,如何实现搜索功能就成了一个比较大的挑战。本文将介绍如何使用 ES 和 Algolia 实现站点搜索功能,并包含示例代码供大家参考。

一、ES 实现站点搜索功能

Elasticsearch 是一个分布式开源搜索和分析引擎,由于其强大的搜索和分析功能,被越来越多的企业和网站所采用。下面将介绍如何使用 ElasticSearch 来实现 Headless CMS 的站点搜索功能。

  1. 前置条件

首先,我们需要准备好以下工具和环境:

  • ElasticSearch:建议使用版本为 7.x 及以上
  • elasticsearch-dsl:帮助我们更方便地使用 ElasticSearch API 的 Python 库
  • Python3 环境
  • Headless CMS:我们将以 Strapi CMS 为例演示搜索功能
  1. 建立索引

首先,我们需要将 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 中。

  1. 搜索数据

接下来就是搜索数据的步骤了。我们可以使用各种查询方式来搜索数据,如全文搜索、精确搜索、聚合查询等。下面是使用 elasticsearch-dsl 实现的一个简单的全文搜索:

-- -------------------- ---- -------
---- ----------------- ------ ------

-------------------------------------------------- -----------

- - ----------------------------- -
    --------------------- -------------- ---------------- -----------

-------- - -----------

--- --- -- -------------------
    ----------------------------

上述代码表示搜索 article_index 索引中的 title 和 content 字段,包含字符串 “world” 的文档。具体实现方式是使用 Search 类来构造查询对象,然后执行 execute() 函数来获取返回结果。结果将会是一个包含匹配的文档的列表。

二、Algolia 实现站点搜索功能

Algolia 是一个全托管的搜索解决方案,为企业和小型团队提供搜索和发现服务。它可以帮助开发者在短时间内完成搜索功能的开发,提供了优秀的搜索性能和搜索体验。下面将介绍如何使用 Algolia 来实现 Headless CMS 的站点搜索功能。

  1. 注册 Algolia 账号

首先,我们需要在 Algolia 官网注册一个账号,并创建一个应用程序。然后,我们需要在应用程序中创建一个索引来存储数据,并获取 API key 用于后续操作。

  1. 安装依赖

接下来,我们需要在项目中安装 Algolia 的 Python SDK。在 Terminal 中输入以下命令即可:

  1. 导入数据

Algolia 适用于结构化数据的搜索,因此我们需要把原始数据转换成可以被搜索的结构化数据格式。通常我们会使用一个叫做 record-helper 的工具来处理数据,具体使用方式请参考 Algolia 的官方文档。

下面是代码演示如何把 Headless CMS 中的 Article 数据转换为 Algolia 可用的数据格式:

-- -------------------- ---- -------
------ -------------
---- ------------- ------ ---------------------------

------ - ------------------------------------- ---------
----- - ---------------------------------

-------- - -
    --------- ------ -------
     ---------- ----- -- -- ----- ---------
     ----------- -------
     ------ ---------
     --------- ------
     ----- ---
    --------- ------------- -- ----
     ---------- ----- -- -- ------------ ------- ----- -----
     ----------- -------------
     ------ -----
     --------- -------
     ----- --
-

- -- -------- -----
-------- - -------------------------------------

- ----
---------------------------- ---------------------------------- ------

上述代码中,我们使用 Algolia 为我们提供的 Client 类来初始化客户端,并通过 init_index() 方法创建了一个名为 “articl_index” 的索引。然后,我们把 CMS 中的 Article 数据转换为 Algolia 中可用的 JSON 格式,并导入到 “articl_index” 索引中。

  1. 搜索数据

最后,我们需要编写代码来搜索数据。Algolia 提供了丰富的查询功能,如全文搜索、模糊搜索、前缀匹配、精确匹配等。下面是一个使用 Algolia 实现的全文搜索示例:

-- -------------------- ---- -------
------ -------------

------ - ------------------------------------- ---------
----- - ---------------------------------

----- - -------

------- - -------------------

- ----
--- --- -- ----------------
    ----------

上述代码中,我们使用了 Algolia 提供的 Python SDK 客户端来构造查询对象,然后通过 search() 函数发起请求,并打印返回结果。

总结

本文分别介绍了使用 ElasticSearch 和 Algolia 实现站点搜索功能的方法和步骤,并提供了具体示例代码供大家参考。在实践 Headless CMS 的开发中,使用现成的搜索解决方案是一个比较好的选择,可以节约开发时间和提高搜索性能。不过,对于更为复杂的搜索需求,也可以使用 Elasticsearch 进行二次开发,从而满足更多的业务需求。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ad108848841e9894936bc7

纠错
反馈