热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Elasticsearch快速搭建食谱搜索系统

云栖君导读:搜索是一个网站的基础功能,一个好的搜索系统可以直接促进页面访问量的提升,目前流行的搜索系统方案都是基于开源的Elasticsearch和Solr搭建。本文以食谱搜索场景为例,介绍如何利用阿里云Elasticsearch快速搭建一个搜索系统。


阅读本文,需要先理解了Elasticsearch相关概念,如索引、类型、文档、映射等。


开通阿里云Elasticsearch服务


由于阿里云Elasticsearch目前支持的网络类型只有用户自有的专有网络(VPC),所以在开通Elasticsearch服务时,如果没有实现创建好的专有网络可选择,则会默认创建一个专有网络。


开通好Elasticsearch服务之后,可能会遇到一个新的问题,即业务系统部署在经典网络的ECS中,默认是无法访问专有网络的,所以需要通过专有网络中提供的Classiclink 的功能,打通经典网络访问专有网络的链路。


完成上述步骤后,可以在业务系统所在的ECS上使用curl命令进行测试,也可以在阿里云Elasticsearch集成的Kibana控制台Dev Tools界面进行测试。


食谱搜索系统设计


使用Elasticsearch快速搭建食谱搜索系统


如上图所示,爬虫从网上抓取食谱数据,先经过关键词提取和加工,得到搜索源数据,然后通过索引构建器调用Elasticsearch提供的Rest API完成索引的创建。同时,提取出食材名称和食谱标签静态数据,用于后续搜索过程中,调Elasticsearch服务前的业务判断。


数据准备及搜索场景设计


如下是一个典型的经过爬虫抓取、加工处理后用于搜索的食谱数据,索引构建器基于该数据结构创建索引和文档。


使用Elasticsearch快速搭建食谱搜索系统


设计的搜索场景如下:


场景1,根据食谱名称精确匹配
输入 水煮牛肉


输出 水煮牛肉食谱


场景2,根据单个食材名称模糊匹配主料和配料,得到包含该食材的食谱列表
输入 牛肉


输出 相关食谱列表


场景3,根据多个名称组合,可能是食材名称/食谱名称/食谱标签,匹配相关食谱列表
输入 牛肉 川菜


输出 相关食谱列表


场景4,根据食谱标签匹配包含该标签的食谱列表
输入 川菜


输出 包含“川菜”标签的食谱列表


场景5,搜索出浏览次数TOP10的食谱


索引创建


阿里云Elasticsearch默认关闭了自动创建索引功能,需要先创建好索引。索引的分析器使用阿里云Elasticsearch服务预置的IK Analyzer插件,该插件也是开源社区热门的中文分词分析器,结合食谱搜索的场景,使用ik_smart分析器对文本进行粗粒度的拆分。


根据搜索场景的需求,需要创建一个索引(Index),包含一个类型(Type),其中食谱名称(recipeName)、主要食材(mainFood)、辅助食材(subFood)、食谱标签(recipeTag)都是可被分词索引的,浏览次数(viewNum)可被索引但不进行分词,剩余不用于搜索的字段可不进行索引。

创建索引的命令如下:


使用Elasticsearch快速搭建食谱搜索系统


索引文档创建


本文所设计的食谱搜索系统是一个实时的搜索系统,爬虫会不断的抓取数据,经过提取加工后由索引构建器调API创建文档,这样也能发挥ElasticSearch在实时搜索方面的优势。


如果有需要在ElasticSearch中大批量创建文档的需求,可以选择使用阿里云数据集成服务从OSS中抽取服务导入到ElasticSearch。

文档创建命令如下:


使用Elasticsearch快速搭建食谱搜索系统


搜索场景实现


场景1,根据食谱名称精确匹配    
场景2,根据单个食材名称模糊匹配主料和配料,得到包含该食材的食谱列表    
场景3,根据多个名称组合,可能是食材名称/食谱名称/食谱标签,匹配相关食谱列表
场景4,根据食谱标签匹配包含该标签的食谱列表


针对以上场景的需求,搜索后台的逻辑如下图所示:

使用Elasticsearch快速搭建食谱搜索系统


各个场景下的搜索过程对应Elasticsearch执行命令分别如下:


场景1.


使用Elasticsearch快速搭建食谱搜索系统


场景2.


使用Elasticsearch快速搭建食谱搜索系统


场景3.


使用Elasticsearch快速搭建食谱搜索系统


场景4.


使用Elasticsearch快速搭建食谱搜索系统


场景5. 搜索出流量次数TOP100的食谱


该场景需要用到搜索排序,并指定搜索返回的记录数是100(默认为10)。


使用Elasticsearch快速搭建食谱搜索系统


阿里云Elasticsearch已正式发布啦,Elastic开源官方联合开发,集成5.5商业版本XPack功能,欢迎开通使用。


了解更多产品信息:

http://click.aliyun.com/m/43986/


end

那些年,阿里巴巴技术男神们写的书!

看完这些干货,再说你因为“怕蛇”,所以学不好Python!

2018年最佳深度学习书单

模型、框架及应用:深度学习系列16讲

更多精彩

使用Elasticsearch快速搭建食谱搜索系统


推荐阅读
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • Python全局解释器锁(GIL)机制详解
    在Python中,线程是操作系统级别的原生线程。为了确保多线程环境下的内存安全,Python虚拟机引入了全局解释器锁(Global Interpreter Lock,简称GIL)。GIL是一种互斥锁,用于保护对解释器状态的访问,防止多个线程同时执行字节码。尽管GIL有助于简化内存管理,但它也限制了多核处理器上多线程程序的并行性能。本文将深入探讨GIL的工作原理及其对Python多线程编程的影响。 ... [详细]
  • Python爬虫入门:深入解析HTTP协议与Requests库的应用
    Python爬虫入门:深入解析HTTP协议与Requests库的应用 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 在安装并配置了Elasticsearch后,我在尝试通过GET /_nodes请求获取节点信息时遇到了问题,收到了错误消息。为了确保请求的正确性和安全性,我需要进一步排查配置和网络设置,以确保Elasticsearch集群能够正常响应。此外,还需要检查安全设置,如防火墙规则和认证机制,以防止未经授权的访问。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 本文探讨了如何有效地构建和优化微信公众平台账号,涵盖了用户信息管理、内容创作与发布、互动策略及数据分析等方面。通过合理设置用户信息字段,如用户名、昵称、密码、真实姓名和性别等,确保账号的安全性和用户体验。同时,文章还介绍了如何利用微信公众平台的各项功能,提升用户参与度和品牌影响力。 ... [详细]
  • Hired网站最新发布的开发者调查显示,Python 语言继续受到开发者的广泛欢迎,而 PHP 则被评为最不受欢迎的语言。该报告基于 Hired 数据科学团队对 13 个城市中 9800 名开发者的调查数据,深入分析了当前编程语言的使用趋势和开发者偏好。此外,报告还探讨了其他热门语言如 JavaScript 和 Java 的表现,并提供了对技术招聘市场的洞见。 ... [详细]
  • 本文介绍了一种利用PHP cURL库高效提取Sohu邮箱联系人列表的方法。通过设置错误报告级别、定义Cookie文件路径等关键步骤,确保了代码的稳定性和可靠性。经过实际测试,该方法在2012年3月24日被验证为有效,能够快速准确地获取联系人信息。此外,文章还提供了详细的代码示例和注意事项,帮助开发者更好地理解和应用这一技术。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有