首页 > 解决方案 > Elasticsearch JS:有没有办法在执行查询并返回命中后执行突出显示?

问题描述

我有一个用户可搜索的 Elasticsearch 索引,其文档通过 Elasticsearch 的快速矢量突出显示以标记突出显示返回。

索引中的文档具有用户访问权限,因此当用户输入搜索查询“John Doe”时,例如,可以返回超过 10,000 个包含“John Doe”匹配项的匹配项,但必须将匹配项列表过滤掉到允许用户访问的前 100 个文档。因此,最终,只有 100 个命中显示给用户。

问题是对返回的所有 10,000 个命中执行快速矢量突出显示,因此 Elasticsearch 对最终被丢弃的 9,900 个命中执行昂贵的突出显示。

如果我们完全删除突出显示,搜索速度会大大提高,但我们确实需要在这一小部分命中上突出显示。有没有办法在执行查询并返回命中后执行突出显示?

标签: javascriptelasticsearch

解决方案


我建议top_hits在您的搜索查询中使用聚合。有了它,您可以指定它只返回前 100 个带有"size": 100. 而且,默认情况下,它按分数排序,因此您应该获得最佳匹配的文档。

并且,要执行突出显示,请添加highlighttop_hits聚合。

{
  "aggs": {
    "some-aggs": {
      "top_hits": {
        "size": 100,
        "highlight": {
          "fields": {
            "<field_to_highlight>": {}
          }
        }    
      }
    }
  }
}

为此,您需要在搜索查询中包含访问检查子句。

Ref: ES 热门 aggs


推荐阅读