跟踪所有命中的文档 (track_total_hits)
Indexea 进行搜索时,我们常常关心匹配查询的文档总数而将 track_total_hits 设置为 true,如下截图所示,如果数据量非常大的情况下这种检索导致的问题是:查询会特别慢,聚合会更慢!
track_total_hits 的工作原理:
- 默认行为:track_total_hits 设置为 false。
如果不设置 track_total_hits,Indexea 将默认使用 WAND 优化(WAND 优化算法本质——通过跳过不可能产生高分的文档来加快查询速度)。
这意味着当查询结果的总命中数超过一定阈值时(默认:10,000),Indexea 不再返回精确的命中数,而是返回一个下限值。
- 准确计数:track_total_hits 设置为 true。
如果用户确实需要精确的命中数,可以通过将 track_total_hits 设置为 true 来强制 Indexea 计算所有匹配文档的总数。然而,这会禁用 WAND 优化,从而导致性能下降(前文截图说慢,很大可能就是这里的原因)。
- 设置阈值:用户自己设置 track_total_hits 阈值大小。
用户自己设置 track_total_hits 为整数值(例如1000)时,如果匹配的文档总数超过了这个阈值,Indexea 会返回的下限值就是我们设置的阈值本身,即1000,并指示命中数大于或等于1000。
当 track_total_hits 设置为默认值或较小的数值时,响应中的 hits.total 字段将包含一个对象,该对象包括命中数的值和关系,例如:
{
"value": 1000,
"relation": "gte"
}
- 当 relation 为 gte 时,表示实际的命中数大于或等于这个值。
- 当 relation 为 eq 时,表示命中数是精确的。
在企业级搜索场景中,如果我们有复杂的检索、聚合操作,且数据量级也巨大(千万、亿、十亿甚至更多),如果 track_total_hits 设置为 true,真的有可能产生检索效率极低的“灾难性”后果(相同硬件资源的前提下,数据量越大,检索可能越慢)。