<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Daniel Rubinstein - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Daniel Rubinstein - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/cn/search-labs/author/daniel-rubinstein</link>
    </image>
    <link>https://www.elastic.co/cn/search-labs/author/daniel-rubinstein</link>
    <atom:link href="https://www.elastic.co/cn/search-labs/rss/author/daniel-rubinstein.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[cn]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 12:35:49 GMT</lastBuildDate>
  <item>
    <title><![CDATA[在 Elasticsearch 中为结构化文档配置递归分块]]></title>
    <description><![CDATA[了解如何在 Elasticsearch 中使用分块大小、分隔符组和自定义分隔符列表配置递归分块，以优化结构文档索引。]]></description>
    <content:encoded><![CDATA[<p>自 8.16 版起，用户可以配置将长文档导入语义文本字段时使用的分块策略。从 9.1 / 8.19 版开始，我们引入了一种新的可配置递归分块策略，使用正则表达式列表对文档进行分块。分块的目的是将长文档分割成囊括相关内容的部分。我们现有的策略会按单词/句子的粒度分割文本，但以结构化格式编写的文档（例如："......"）则不会这样做。Markdown）通常会在由一些分隔字符串定义的部分内包含相关内容（例如："......"）。标题）。对于这些类型的文档，我们正在引入递归分块策略，以利用结构化文档的格式来创建更好的分块！</p><h2>什么是递归分块？</h2><p>递归分块法会遍历所提供的分块模式列表，逐步将文档分成更小的分块，直到达到所需的最大分块大小。</p><h3>如何配置递归分块？</h3><p>以下是用户为递归分块提供的可配置值：</p><ul><li><p>(必填）<code>max_chunk_size</code> ：字块中的最大字数。</p></li><li><p>任选其一：</p><ul><li><p><code>separators</code>:用于将文档分割成块的 regex 字符串模式列表。</p></li><li><p><code>separator_group</code>:一个字符串，它将映射到 Elastic 定义的默认分隔符列表，用于特定类型的文档。目前，<code>markdown</code> 和<code>plaintext</code> 。</p></li></ul></li></ul><h3>递归分块是如何工作的？</h3><p>递归分块的过程如下：给定输入文档、<code>max_chunk_size</code> （以字数为单位）和分隔符字符串列表：</p><ol><li><p>如果输入文档已经在最大分块大小范围内，则返回一个涵盖整个输入文档的分块。</p></li><li><p>根据分隔符的出现次数，将文本分割成潜在的文本块。对于每个潜在的数据块</p><ol><li><p>如果潜在数据块在最大数据块大小范围内，则将其添加到要返回给用户的数据块列表中。</p></li><li><p>否则，从第 2 步开始重复，只使用潜在文本块中的文本，并使用列表中的下一个分隔符进行分割。如果没有其他分隔符可以尝试，就退回到基于句子的分块。</p></li></ol></li></ol><h2>配置递归分块的示例</h2><p>除了分块大小，递归分块的主要配置是选择应使用哪些分隔符来分割文档。如果您不确定从哪里开始，Elasticsearch 提供了一些默认的分离器组，可用于常见的使用情况。</p><h3>利用分离器组</h3><p>要使用分隔组，只需在配置分块设置时提供要使用的组名即可。例如</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separator_group": "plaintext"
}<p>这样就可以利用分隔符列表<code>["(?&lt;!\\n)\\n\\n(?!\\n)", "(?&lt;!\\n)\\n(?!\\n)")]</code> 来实现递归分块策略。对于一般的纯文本应用程序，这种方法效果很好，可以在 2 个换行符后再分隔出 1 个换行符。</p><p>我们还提供一个分隔符组<code>markdown</code> ，它将利用分隔符列表：</p>[
"\n# ",
       "\n## ",
       "\n### ",
       "\n#### ",
       "\n##### ",
       "\n###### ",
       "\n^(?!\\s*$).*\\n-{1,}\\n",
       "\n^(?!\\s*$).*\\n={1,}\\n"
]<p>这个分隔符列表可以很好地适用于一般的标记符使用情况，在 6 个标题层次和分节符上分别进行分隔。</p><p>创建资源（推理端点/语义文本字段）时，与当时分隔符组相对应的分隔符列表将存储在您的配置中。如果以后更新了分隔符组，也不会改变已创建资源的行为。</p><h3>使用自定义分隔符列表</h3><p>如果预定义的分隔符组不适合您的使用情况，您可以定义一个符合您需求的自定义分隔符列表。请注意，可以在分隔符列表中提供正则表达式。以下是使用自定义分隔符配置分块设置的示例：</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separators": ["\n\n", "\n", "&lt;my-custom-separator&gt;"]
}<p>上述分块策略将在 2 个换行符、1 个换行符和一个字符串<code>“&lt;my-custom-separator&gt;”</code> 上进行分割。</p><h2>递归分块的实际应用示例</h2><p>让我们来看一个递归分块的实例。在本示例中，我们将使用以下分块设置和自定义分隔符列表，使用顶部两层标题分割标记符文档：</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separators": ["\n# ", "\n## "]
}<p>让我们来看看一个简单的未分块 Markdown 文档：</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdb5f41d1bd43ba50/6a17e831e9ea87c1d8a9c5f3/3a5507f4a1288065097231548e5b18e240508785-1302x1446.png" alt="未分块的 Markdown 文档" /><p>现在，让我们使用上面定义的分块设置对文档进行分块：</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfffda162c7b9c87a/6a17e83296142aefa8eb1b0b/a3313c4c40ff39b8dbcdd7c4878c723f088e6c1a-1600x1187.png" alt="在 Elasticsearch 中将文档分块" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt96f65346a8e09e3a/6a17e834445de9157b4d015e/79a2921943191ea631df94c9d465818ec8d3e738-1600x1206.png" alt="在第二个分隔符上拆分--在 Elasticsearch 中将文档分块" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt28381c8f85aedf07/6a17e836ec0f89801e5a6640/459e695cce7540267422396b9a62ff4ad35f61db-1600x1260.png" alt="Elasticsearch 中基于句子的分块处理后文档中的最终分块" /><p>注意：每个分块（分块 3 除外）末尾的换行符不会突出显示，而是包含在实际分块边界内。</p><h3>今天就开始使用递归分块技术！</h3><p>有关使用该功能的更多信息，请查看有关配置分块设置的文档。</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/recursive-chunking-structured-documents-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/recursive-chunking-structured-documents-elasticsearch</guid>
    <category><![CDATA[基础功能]]></category>
    <category><![CDATA[在 Elastic 内部]]></category>
    <category><![CDATA[AI]]></category>
    <dc:creator><![CDATA[Daniel Rubinstein]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf442dc4941f37be7/6a17e838505ac3eaf8ad8b3d/591872e31880768ca927507654a621addc0d124d-1600x960.png" length="0" type="image/png"/>
    <pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>