译者注:想要构建或改进搜索体验?从这里开始。以下为译文。
如果你问一名软件工程师:“如何给产品添加搜索功能?”或者“如何构建一个搜索引擎?”你可能会得到这样一个回答:“我们刚刚推出了ElasticSearch集群,以后再也不用担心构建搜索功能了。”
但真的是这样吗?许多现有产品仍然 有 很不友好的 搜索 体验。很多工程师对搜索引擎的工作原理知之甚微,而这些知识往往是提高搜索质量的必要条件。
尽管有很多的开源软件包,也有了很多的研究成果,但很少有介绍关于如何构建稳定搜索体验的文章。更讽刺的是,如果在网上搜索关于搜索技能的专业,得到的结果其实并不是自己想要的。
如果你想构建搜索功能,那么这篇文章会对你提供很大的帮助。当然,并不是说这篇文章会包含所有的内容,但我们会根据读者的反馈进行修改。
由于我有谷歌、Airbnb和几家初创公司的工作经验,因此我将基于这些经验介绍一些受欢迎的方法、算法、技术和工具。
如果你不了解搜索相关的问题有多复杂,那么产品的用户体验也肯定很糟糕,这样不仅让之前的努力付出东流,产品还很有可能会失败。
如果你缺乏耐心或者已经了解了很多知识,那么可以直接浏览工具和服务部分。
这篇文章很长,但我们所涵盖的大部分内容都基于下面四个基本原则:
实际上搜索是一个综合问题:
质量、度量和流程非常重要:
使用现有的技术:
即使你买了,也需要了解细节:
每款产品的搜索都不相同,而选择则需要依赖于需求的许多技术细节。它有助于识别搜索问题的关键参数:
通过这些点来思考,可以帮助你在设计和构建单个搜索系统组件时做出重要的选择。
生产索引管道。
现在让我们看一遍搜索子问题列表。这些通常由形成管道的独立子系统来解决。这意味着一个给定的子系统将消耗以前子系统的输出,并为下列子系统生成输入。
这导致了生态系统的一个重要特性:一旦你改变了上游子系统的工作方式,你就需要评估变化的影响,并可能改变下游的行为。
下面是你需要解决的重要的问题:
索引选择:
给定一组文档(例如,整个Internet,所有的Twitter帖子,Instagram上的所有图片),选择一个可能更小的文档子集,作为搜索结果可能值得考虑,并且只包括索引中的那些,丢弃其余部分。这样做是为了使索引紧凑,而且几乎是正交的,以选择要显示给用户的文档。一些特殊类别的文件没有被削减可能包括:
垃圾处理:
哦,所有不同的形状和大小的搜索垃圾邮件!一个巨大的主题本身,值得单独的指导。一个好的网络垃圾分类概述。
不受欢迎的文档:
域约束可能需要过滤:色情、非法内容等。这些技术类似于垃圾邮件过滤,可能需要额外的启发式。
重复的:
或接近重复的文件。可以通过本地敏感的散列、相似度度量、聚类技术甚至是clickthrough数据完成。一个很好的技术概述。
较低的文档:
效用的定义在很大程度上依赖于问题领域,因此很难推荐这里的方法。有些想法是:可能为您的文档构建一个实用程序函数;heuristics可能起作用,或者例如一个只包含黑色像素的图像不是一个有用的文档;实用程序可以从用户行为中学习。
索引结构:
对于大多数搜索系统,文档检索是使用反向索引执行的——通常称为索引。
这篇文章并不是一篇教程,但是如果你想现在就构建一个搜索体验,这里倒是有一个简短的概述:
正如上面所说的,如果你有一定的经济基础,可以选择购买现成的SaaS(下面列举了一些评价不错的)。现有的服务适用于:
你的经验是一个“连接”一个(你的服务或应用有互联网连接)。
它是否支持您需要的所有功能?这篇文章很好地阐述了你想要什么样的功能。举几个例子,我至少要考虑一下:支持你正在搜索的媒体;实时索引支持;查询灵活性,包括上下文相关的查询。
考虑到语料库的大小和预期的QpS,你能负担得起未来12个月的费用吗?
服务是否能够支持预期的流量,在所需的延迟范围内?如果您正在从应用程序查询服务,请确保给定的服务能够快速访问您的用户所在的位置。
如果托管解决方案不适合您的需求或资源,您可能需要使用一个开源库或工具。如果有联网的应用程序或网站,我现在就选择弹性搜索。对于嵌入式体验,下面有多种工具。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。