显著文本聚合

significant_text 聚合类似于 significant_terms 聚合,但它适用于原始文本字段。显著文本通过统计分析来衡量前景集和背景集之间流行度的变化。例如,当您搜索股票代码 TSLA 时,它可能会推荐 Tesla。

significant_text 聚合会即时重新分析源文本,过滤掉重复段落、样板页眉和页脚等可能扭曲结果的噪声数据。

重新分析高基数数据集可能是一项非常消耗 CPU 的操作。我们建议在采样器聚合中使用 significant_text 聚合,将分析限制在一小部分最佳匹配文档中,例如 200 个。

您可以设置以下参数:

  • min_doc_count - 返回匹配超过配置数量的热门命中的结果。我们建议不要将 min_doc_count 设置为 1,因为这往往会返回拼写错误或笔误的词项。找到一个词项的多个实例有助于强化其显著性并非偶然事件的结果。默认值 3 用于提供最小证据权重。

  • shard_size - 设置较高的值会以牺牲计算性能为代价来提高稳定性(和准确性)。

  • shard_min_doc_count - 如果您的文本包含许多低频词,并且您对这些词不感兴趣(例如拼写错误),那么您可以设置 shard_min_doc_count 参数,在分片级别过滤掉候选词项,并有合理把握认为即使合并本地显著文本频率后,这些词项也无法达到所需的 min_doc_count 值。默认值为 1,在您显式设置之前不会产生影响。我们建议将此值设置为远低于 min_doc_count 的值。

假设您已将莎士比亚全集索引到 UDB-SX 集群中。您可以在 text_entry 字段中找到与单词 “breathe” 相关的显著文本:

GET shakespeare/_search
{
  "query": {
    "match": {
      "text_entry": "breathe"
    }
  },
  "aggregations": {
    "my_sample": {
      "sampler": {
        "shard_size": 100
      },
      "aggregations": {
        "keywords": {
          "significant_text": {
            "field": "text_entry",
            "min_doc_count": 4
          }
        }
      }
    }
  }
}

示例响应

"aggregations" : {
  "my_sample" : {
    "doc_count" : 59,
    "keywords" : {
      "doc_count" : 59,
      "bg_count" : 111396,
      "buckets" : [
        {
          "key" : "breathe",
          "doc_count" : 59,
          "score" : 1887.0677966101694,
          "bg_count" : 59
        },
        {
          "key" : "air",
          "doc_count" : 4,
          "score" : 2.641295376716233,
          "bg_count" : 189
        },
        {
          "key" : "dead",
          "doc_count" : 4,
          "score" : 0.9665839666414213,
          "bg_count" : 495
        },
        {
          "key" : "life",
          "doc_count" : 5,
          "score" : 0.9090787433467572,
          "bg_count" : 805
        }
      ]
    }
  }
 }
}

breathe 最相关的显著文本是 airdeadlife

significant_text 聚合有以下限制:

  • 不支持子聚合,因为子聚合的内存成本很高。作为解决方法,您可以使用带有 include 子句和子聚合的 terms 聚合来添加后续查询。

  • 不支持嵌套对象,因为它处理的是文档 JSON 源。

  • 文档计数可能有一些(通常很小)不准确之处,因为它基于从每个分片返回的样本总和。您可以使用 shard_size 参数来微调准确性和性能之间的权衡。默认情况下,shard_size 设置为 -1,以自动估计分片数量和 size 参数。

背景词频的统计信息的默认来源是整个索引。您可以使用背景过滤器缩小此范围,以便更聚焦:

GET shakespeare/_search
{
  "query": {
    "match": {
      "text_entry": "breathe"
    }
  },
  "aggregations": {
    "my_sample": {
      "sampler": {
        "shard_size": 100
      },
      "aggregations": {
        "keywords": {
          "significant_text": {
            "field": "text_entry",
            "background_filter": {
              "term": {
                "speaker": "JOHN OF GAUNT"
              }
            }
          }
        }
      }
    }
  }
}