在 Elasticsearch 中为结构化文档配置递归分块

了解如何在 Elasticsearch 中使用分块大小、分隔符组和自定义分隔符列表配置递归分块,以优化结构文档索引。

刚接触 Elasticsearch 吗?欢迎参加我们的 Elasticsearch 入门网络研讨会。您也可以开始免费云服务试用,或立即在您的计算机上试用 Elastic。

自 8.16 版起,用户可以配置将长文档导入语义文本字段时使用的分块策略。从 9.1 / 8.19 版开始,我们引入了一种新的可配置递归分块策略,使用正则表达式列表对文档进行分块。分块的目的是将长文档分割成囊括相关内容的部分。我们现有的策略会按单词/句子的粒度分割文本,但以结构化格式编写的文档(例如:"......")则不会这样做。Markdown)通常会在由一些分隔字符串定义的部分内包含相关内容(例如:"......")。标题)。对于这些类型的文档,我们正在引入递归分块策略,以利用结构化文档的格式来创建更好的分块!

什么是递归分块?

递归分块法会遍历所提供的分块模式列表,逐步将文档分成更小的分块,直到达到所需的最大分块大小。

如何配置递归分块?

以下是用户为递归分块提供的可配置值:

  • (必填)max_chunk_size :字块中的最大字数。
  • 任选其一:
    • separators:用于将文档分割成块的 regex 字符串模式列表。
    • separator_group:一个字符串,它将映射到 Elastic 定义的默认分隔符列表,用于特定类型的文档。目前,markdownplaintext

递归分块是如何工作的?

递归分块的过程如下:给定输入文档、max_chunk_size (以字数为单位)和分隔符字符串列表:

  1. 如果输入文档已经在最大分块大小范围内,则返回一个涵盖整个输入文档的分块。
  2. 根据分隔符的出现次数,将文本分割成潜在的文本块。对于每个潜在的数据块
    1. 如果潜在数据块在最大数据块大小范围内,则将其添加到要返回给用户的数据块列表中。
    2. 否则,从第 2 步开始重复,只使用潜在文本块中的文本,并使用列表中的下一个分隔符进行分割。如果没有其他分隔符可以尝试,就退回到基于句子的分块。

配置递归分块的示例

除了分块大小,递归分块的主要配置是选择应使用哪些分隔符来分割文档。如果您不确定从哪里开始,Elasticsearch 提供了一些默认的分离器组,可用于常见的使用情况。

利用分离器组

要使用分隔组,只需在配置分块设置时提供要使用的组名即可。例如

这样就可以利用分隔符列表["(?<!\\n)\\n\\n(?!\\n)", "(?<!\\n)\\n(?!\\n)")] 来实现递归分块策略。对于一般的纯文本应用程序,这种方法效果很好,可以在 2 个换行符后再分隔出 1 个换行符。

我们还提供一个分隔符组markdown ,它将利用分隔符列表:

这个分隔符列表可以很好地适用于一般的标记符使用情况,在 6 个标题层次和分节符上分别进行分隔。

创建资源(推理端点/语义文本字段)时,与当时分隔符组相对应的分隔符列表将存储在您的配置中。如果以后更新了分隔符组,也不会改变已创建资源的行为。

使用自定义分隔符列表

如果预定义的分隔符组不适合您的使用情况,您可以定义一个符合您需求的自定义分隔符列表。请注意,可以在分隔符列表中提供正则表达式。以下是使用自定义分隔符配置分块设置的示例:

上述分块策略将在 2 个换行符、1 个换行符和一个字符串“<my-custom-separator>” 上进行分割。

递归分块的实际应用示例

让我们来看一个递归分块的实例。在本示例中,我们将使用以下分块设置和自定义分隔符列表,使用顶部两层标题分割标记符文档:

让我们来看看一个简单的未分块 Markdown 文档:

现在,让我们使用上面定义的分块设置对文档进行分块:

注意:每个分块(分块 3 除外)末尾的换行符不会突出显示,而是包含在实际分块边界内。

今天就开始使用递归分块技术!

有关使用该功能的更多信息,请查看有关配置分块设置的文档。

相关内容

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

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

亲自试用