# 查询建议
当你在 Google 或 Amazon 等平台开始输入搜索词时,可能会看到一个下拉菜单显示可供尝试的查询建议:


本文将讨论如何使用 Typesense 实现查询建议功能。
# 两种实现方式
实现查询建议有两种互补的方法。根据你的搜索流量与数据集大小的对比情况,可以选择使用其中一种或同时使用两种方式。
# 1. 从主数据集获取查询建议
如果你的搜索流量相对较低(比如每月数千次搜索),或者用户通常输入的搜索词未能覆盖超过 80% 的数据集,你可以选择直接从主数据集显示结果或建议。
# 历史背景
在查询建议流行之前,典型的搜索用户体验是让用户输入搜索词并按回车键查看结果。如果他们没有看到任何结果,就必须返回并重复这个过程。
问题所在: 每次按回车键执行搜索查询都会给用户带来足够的阻力,阻碍他们进一步搜索和探索底层数据集。
理想解决方案: 在用户输入时立即显示结果,而不是每次都要求他们按下回车键。
然而,从历史上看,搜索引擎在对整个数据集进行每次按键查询时相对较慢或计算密集。因此,这种理想解决方案在大规模场景下无法有效实现。
为了缓解这个问题,查询建议(Query Suggestions)的概念应运而生: 您只需索引最热门搜索词的一个子集(而非完整记录),并针对这个较小的数据集运行搜索,在每次按键时显示查询建议,让用户选择一个建议后仍需按下"Enter"键来对完整数据集进行搜索。
# 现代搜索体验
借助像 Typesense 这样的即时搜索引擎(其整个搜索索引都存储在内存中),现在可以实现对整个数据集进行搜索,并立即从主数据集中向用户展示结果,而无需用户在任何时候按下回车键。
例如,这里展示了一种"输入即搜索"的体验,演示了这种用户交互方式。请注意,它没有分步显示建议然后再跳转到结果页面,而是直接在大多数查询中(即使是处理 3200 万条记录的情况下)以不到 50 毫秒的响应时间向用户展示完整结果:
这里是该体验的在线演示链接:songs-search.typesense.org (opens new window)
另一个使用 Typesense 实现联合"输入即搜索"功能的网站是:www.echidnasewing.com.au (opens new window)(尝试搜索"wool")。
如果您仍然需要实现下拉式查询建议功能,Typesense 同样可以满足这一需求。您可以将搜索查询发送到包含所有数据的主集合,但在 UI 中显示结果时,可以选择文档中的某个字段以下拉列表的形式展示给用户。这主要是一种界面呈现方式的处理。
# 2. 基于搜索历史的查询建议
如果您的网站有足够的搜索流量,您可以从前端收集用户在搜索框中输入的搜索词,
将它们聚合起来,添加到 Typesense 的一个新 popular_queries
集合中,同时为每个搜索词记录一个流行度分数。
当用户输入搜索词时,您可以使用 multi_search
查询,
将查询同时发送到包含您数据集的主集合和 popular_queries
集合。
这样您就可以根据其他用户过去输入的搜索词向用户显示建议,如果这些建议不存在,则显示来自完整数据集的结果,两者并列展示,为用户提供更多探索数据的方式。
从 v0.25.0 版本开始,Typesense 可以原生地收集和聚合搜索词。了解更多关于 搜索分析和查询建议 的信息。