检索器编辑

此功能处于技术预览阶段,可能会在将来的版本中更改或删除。Elastic 将努力解决任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。

检索器是在 8.14.0 中添加到搜索 API 的抽象。此抽象允许在单个 _search 调用中配置多阶段检索管道。这简化了您的搜索应用程序逻辑,因为您不再需要通过多个 Elasticsearch 调用配置复杂的搜索,也不需要实现额外的客户端逻辑来组合来自不同查询的结果。

本文档提供了检索器抽象的概述。有关实现细节(包括显着限制),请查看 参考文档,位于 _search API 文档中。

检索器类型编辑

检索器有多种类型,每种类型都针对不同的搜索操作量身定制。目前提供以下检索器

  • 标准检索器。从传统的 查询 中返回最相关的文档。模拟传统的查询,但在检索器框架的上下文中。这确保了向后兼容性,因为现有的 _search 请求仍然受支持。这样,您就可以按照自己的节奏过渡到新的抽象,而无需混合语法。
  • kNN 检索器。从 knn 搜索 中返回最相关的文档,在检索器框架的上下文中。
  • RRF 检索器。使用倒数排名融合 (RRF) 算法组合和排名多个第一阶段检索器。允许您将具有不同相关性指标的多个结果集组合成一个结果集。RRF 检索器是 复合检索器,其中其 filter 元素会传播到其子检索器。

    子检索器可能不会使用受复合检索器作为检索器树的一部分而限制的元素。有关详细示例以及如何使用 RRF 检索器的信息,请参阅 RRF 文档

敬请期待未来版本中更多检索器类型!

检索器有什么用?编辑

以下是检索器有什么用以及它们与常规查询有何不同的概述。

  1. 简化的用户体验。检索器通过允许在单个 API 调用中配置整个检索管道来简化用户体验。这通过自动将传统查询元素转换为相应的检索器来保持与传统查询元素的向后兼容性。
  2. 结构化检索。检索器提供了一种更结构化的方式来定义搜索操作。它们允许使用“检索器树”来描述搜索,检索器树是一种分层结构,它阐明了操作的顺序和逻辑,使复杂的搜索更易于理解和管理。
  3. 可组合性和灵活性。检索器支持灵活的可组合性,允许您构建管道并将不同的检索策略无缝集成到这些管道中。检索器使测试不同的检索策略组合变得容易。
  4. 复合操作。检索器可以有子检索器。这允许复杂的嵌套搜索,其中一个检索器的结果会馈送到另一个检索器,从而支持可能涉及多个阶段或条件的复杂查询策略。
  5. 检索作为一等概念。与传统的查询(其中查询是更大搜索 API 调用的一个部分)不同,检索器被设计为独立的实体,可以组合使用或单独使用。这使得构建搜索更加模块化和灵活。
  6. 增强对文档评分和排名的控制。检索器允许更明确地控制文档的评分和过滤方式。例如,您可以指定最低评分阈值,应用复杂的过滤器而不影响评分,并使用 terminate_after 等参数进行性能优化。
  7. 与现有 Elasticsearch 功能集成。尽管检索器可以代替现有的 _search API 语法(如 queryknn),但它们被设计为与分页 (search_after) 和排序等功能无缝集成。它们还通过将所有叶子检索器的组合视为布尔查询中的 should 子句来保持与聚合操作的兼容性。
  8. 更清晰的关注点分离。当使用复合检索器时,只允许使用查询元素,这强制执行更清晰的关注点分离,并防止过度嵌套或相互依赖的配置带来的复杂性。

示例编辑

以下示例演示了如何使用检索器简化 RRF 排名的查询可组合性。

GET example-index/_search
{
  "retriever": {
    "rrf": {
      "retrievers": [
        {
          "standard": {
            "query": {
              "text_expansion": {
                "vector.tokens": {
                  "model_id": ".elser_model_2",
                  "model_text": "What blue shoes are on sale?"
                }
              }
            }
          }
        },
        {
          "standard": {
            "query": {
              "match": {
                "text": "blue shoes sale"
              }
            }
          }
        }
      ]
    }
  }
}

此示例演示了如何将不同的检索策略组合到单个 retriever 管道中。

与使用 sub_searches 方法的 RRF 进行比较

展开 以查看示例
GET example-index/_search
{
  "sub_searches":[
    {
      "query":{
        "match":{
          "text":"blue shoes sale"
        }
      }
    },
    {
      "query":{
        "text_expansion":{
          "vector.tokens":{
            "model_id":".elser_model_2",
            "model_text":"What blue shoes are on sale?"
          }
        }
      }
    }
  ],
  "rank":{
    "rrf":{
      "window_size":50,
      "rank_constant":20
    }
  }
}

词汇表编辑

以下是一些重要术语

  • 检索管道。定义生成最相关匹配的整个检索和排名逻辑。
  • 检索器树。定义检索器如何交互的分层结构。
  • 第一阶段检索器。返回一组初始候选文档。
  • 复合检索器。基于一个或多个检索器,增强文档检索和排名逻辑。
  • 组合器。将来自多个子检索器的最相关匹配合并的复合检索器。

检索器在实际应用中编辑

搜索游乐场使用检索器抽象构建 Elasticsearch 查询。它会自动检测索引中的字段和类型,并根据您的选择构建检索器树。

您可以使用游乐场来试验不同的检索器配置,并查看它们如何影响搜索结果。

有关更多信息,请参阅 游乐场文档