使用 Elasticsearch Go 客户端执行文本查询

通过实际示例了解如何使用 Elasticsearch Go 客户端在 Elasticsearch 中执行传统文本查询。

亲身体验 Elasticsearch:深入了解我们的示例笔记本,开始免费云服务试用,或立即在您的本地计算机上试用 Elastic。

使用包括 Go 语言在内的任何编程语言构建软件,都需要终身学习。在整个大学和工作生涯中,Carly 需要适应多语言环境,并涉猎多种编程语言,包括 Python、C、JavaScript、TypeScript 和 Java。但这还不够!所以最近她也开始玩围棋了!

就像动物、编程语言和您的一位友好作家一样,搜索也经历了不同实践的演变,您可能很难在自己的搜索用例中做出选择。在本博客中,我们将概述传统的关键字搜索,并以使用 Elasticsearch Elasticsearch Go 客户端 为例 进行说明。

准备工作

要学习本示例,请确保满足以下前提条件:

  1. 安装 Go 1.21 或更高版本
  2. 使用Go 文档中推荐的结构和软件包管理创建自己的 Go 仓库
  3. 创建您自己的 Elasticsearch 集群,其中包含一组 基于啮齿动物的页面 ,包括维基百科中与我们友好的 Gopher 的 页面 :

连接到 Elasticsearch

在我们的示例中,我们将使用 Go 客户端提供的类型 API。要为任何查询建立安全连接,都需要使用以下任一种方法配置客户端:

  1. 云 ID 和 API 密钥(如果使用弹性云)。
  2. 集群 URL、用户名、密码和证书。

连接到位于 Elastic Cloud 上的集群的过程如下:

如稍后所示,client 连接可用于搜索。

自 1990 年第一个有文字记载的互联网搜索引擎Archie 诞生以来,关键词搜索就是我们所熟悉的基础搜索类型。

关键词搜索的核心部分是将文件翻译成倒排索引。与教科书后面的索引完全相同,倒排索引包含标记列表与其在每个文档中的位置之间的映射。下图显示了生成索引的关键阶段:

如上所述,Elasticsearch 中令牌的生成包括三个关键阶段:

  1. 通过 0 个或多个char_filters 删除不必要的字符。在我们的示例中,我们通过html_strip 过滤器去除body_content 字段中的 HTML 元素。
  2. 使用standard 令牌化器 从内容中分割 令牌 ,令牌 化器 会根据间距和关键标点符号进行分割。
  3. 使用零个或多个filter 选项,如lowercase token filter 或 stemmersnowball 等词干转换器,从令牌转换器的输出流中移除不需要的令牌或转换令牌,以便将令牌转换回其语言词根。

用 Go 在 Elasticsearch 中搜索

使用 Go 客户端进行查询时,我们要指定要搜索的索引,并传递查询和其他选项,就像下面的示例一样:

在上面的示例中,我们执行了一个标准的match 查询,以查找索引中包含传入函数的指定字符串的任何文档。请注意,我们通过Do(context.Background()) 向搜索执行传递了一个新的空上下文。此外,Elasticsearch 返回的任何错误都会输出到err 属性,以便记录日志和处理错误。

结果以res.Hits.Hits 的形式返回,其中_Source 属性包含 JSON 格式的文档本身。要将该源代码转换为 Go 友好的结构,我们需要使用 Go encoding/json 包对 JSON 响应进行 解码 ,如下例所示:

搜索并取消查询gopher 将如期返回维基百科中有关 Gopher 的页面:

然而,如果我们询问What do Gophers eat? ,就不会得到我们想要的结果:

通过简单的关键字搜索,就能以我们熟悉的方式将结果返回到 Go 应用程序中。它还能很好地进行精确的术语匹配,这与查找特定公司或术语等情况相关。

然而,正如我们在上文所看到的,由于词汇不匹配问题,它在识别上下文和语义方面存在困难。此外,对图像和音频等非文本文件格式的支持也具有挑战性。

结论

在这里,我们讨论了如何使用 Elasticsearch Go 客户端 在 Elasticsearch 中执行传统文本查询。鉴于 Go 被广泛用于基础设施脚本和构建网络服务器,因此了解如何用 Go 进行搜索非常有用。

查看GitHub 仓库中本系列的所有代码。请继续阅读第 2 部分,了解矢量搜索的概述以及如何在 Go 中执行矢量搜索。在此之前,祝您打地鼠愉快!

资源

  1. Elasticsearch 指南
  2. Elasticsearch Go 客户端
  3. 了解 Elasticsearch 中的分析(分析器),作者 Bo Andersen | #CodingExplained

相关内容

准备好打造最先进的搜索体验了吗?

足够先进的搜索不是一个人的努力就能实现的。Elasticsearch 由数据科学家、ML 操作员、工程师以及更多和您一样对搜索充满热情的人提供支持。让我们联系起来,共同打造神奇的搜索体验,让您获得想要的结果。

亲自试用