正在加载

使用 semantic_text 进行语义搜索

Elastic Stack Serverless

本教程演示如何使用语义文本功能对您的数据执行语义搜索。

语义文本通过在摄取时提供推理和合理的默认值来简化推理工作流程。您无需定义模型相关设置和参数,或创建推理摄取管道。

在 Elastic Stack 中使用语义搜索的推荐方法是遵循 semantic_text 工作流程。当您需要更多地控制索引和查询设置时,您仍然可以使用完整的推理工作流程(请参阅本教程以复习该过程)。

本教程使用 elasticsearch 服务进行演示,但您可以使用任何服务及其 Inference API 提供的支持模型。

本教程使用 elasticsearch 服务进行演示,该服务会根据需要自动创建。 要将 semantic_text 字段类型与 elasticsearch 服务以外的推理服务一起使用,您必须使用创建推理 API创建推理端点。

必须创建目标索引(包含推理端点将基于您的输入文本生成的嵌入的索引)的映射。 目标索引必须具有带有 semantic_text 字段类型的字段,以索引所用推理端点的输出。

 PUT semantic-embeddings {
  "mappings": {
    "properties": {
      "content": {
        "type": "semantic_text"
      }
    }
  }
}
  1. 包含生成的嵌入的字段的名称。
  2. 包含嵌入的字段是 semantic_text 字段。 由于未提供 inference_id,因此使用 elasticsearch 服务的默认端点 .elser-2-elasticsearch。 要使用不同的推理服务,您必须首先使用创建推理 API创建一个推理端点,然后在 semantic_text 字段映射中使用 inference_id 参数指定它。
注意

如果您使用 Web 爬虫或连接器来生成索引,则必须更新这些索引的索引映射以包含 semantic_text 字段。 更新映射后,您需要运行完整的 Web 爬网或完整的连接器同步。 这样可确保重新处理所有现有文档,并使用新的语义嵌入进行更新,从而在更新后的数据上启用语义搜索。

在此步骤中,您加载稍后用于从中创建嵌入的数据。

使用 msmarco-passagetest2019-top1000 数据集,它是 MS MARCO Passage Ranking 数据集的子集。 它由 200 个查询组成,每个查询都附带一个相关文本段落列表。 所有唯一的段落及其 ID 都已从该数据集中提取并编译到一个 tsv 文件中。

下载该文件并使用机器学习 UI 中的 数据可视化工具将其上传到您的集群。 分析完数据后,单击“覆盖设置”。 在“编辑字段名称”下,将 id 分配给第一列,将 content 分配给第二列。 单击“应用”,然后单击“导入”。 将索引命名为 test-data,然后单击“导入”。 上传完成后,您将看到一个名为 test-data 的索引,其中包含 182,469 个文档。

通过将数据从 test-data 索引重新索引到 semantic-embeddings 索引,从文本创建嵌入。 content 字段中的数据将被重新索引到目标索引的 content 语义文本字段中。 重新索引的数据将由与 content 语义文本字段关联的推理端点处理。

注意

此步骤使用 reindex API 模拟数据摄取。 如果您正在处理已建立索引的数据,而不是使用 test-data 数据集,则需要重新索引以确保数据由推理端点处理并生成必要的嵌入。

 POST _reindex?wait_for_completion=false {
  "source": {
    "index": "test-data",
    "size": 10
  },
  "dest": {
    "index": "semantic-embeddings"
  }
}
  1. 重新索引的默认批处理大小为 1000。 将大小减小到较小的数字可以更快地更新重新索引过程,这使您可以密切关注进度并及早发现错误。

该调用返回一个任务 ID 以监视进度

 GET _tasks/<task_id> 

重新索引大型数据集可能需要很长时间。 您可以仅使用数据集的子集来测试此工作流程。 为此,请取消重新索引过程,并且仅为重新索引的子集生成嵌入。 以下 API 请求将取消重新索引任务

 POST _tasks/<task_id>/_cancel 

使用嵌入对数据建立索引后,您可以使用语义搜索查询数据。 在 Query DSLES|QL 语法之间进行选择以执行查询。

Query DSL 方法将 semantic 查询类型与 semantic_text 字段一起使用

GET semantic-embeddings/_search
{
  "query": {
    "semantic": {
      "field": "content",
      "query": "What causes muscle soreness after running?"
    }
  }
}
  1. 您要在其上执行搜索的 semantic_text 字段。
  2. 查询文本。

ES|QL 方法使用 match (:) 运算符,该运算符会自动检测 semantic_text 字段并在其上执行搜索。 该查询使用 METADATA _score_score 降序排序。

 POST /_query?format=txt {
  "query": """
    FROM semantic-embeddings METADATA _score
    | WHERE content: "How to avoid muscle soreness while running?"
    | SORT _score DESC
    | LIMIT 1000
  """
}
  1. METADATA _score 子句用于返回每个文档的分数
  2. match (:) 运算符 用于 content 字段进行标准关键字匹配
  3. 按降序分数排序以首先显示最相关的结果
  4. 将结果限制为 1000 个文档
  • 如果您想在混合搜索中使用 semantic_text,请参阅此笔记本以获取分步指南。
  • 有关如何优化您的 ELSER 端点的更多信息,请参阅模型文档中的 ELSER 建议部分。
  • 要了解有关模型自动缩放的更多信息,请参阅经过训练的模型自动缩放页面。
© . All rights reserved.