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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 搜索是一个网站的基础功能,一个好的搜索系统可以直接促进页面访问量的提升,目前流行的搜索系统方案都是基于开源的Elasticsearch和Solr搭建。本文以食谱搜索场景为例,介绍如何利用阿里云Elasticsearch快速搭建一个搜索系统。

搜索是一个网站的基础功能,一个好的搜索系统可以直接促进页面访问量的提升,目前流行的搜索系统方案都是基于开源的Elasticsearch和Solr搭建。本文以食谱搜索场景为例,介绍如何利用阿里云Elasticsearch快速搭建一个搜索系统。 阅读本文,需要先理解了Elasticsearch相关概念,如索引、类型、文档、映射等。 ### 开通阿里云Elasticsearch服务 由于阿里云Elasticsearch目前支持的网络类型只有用户自有的专有网络(VPC),所以在开通Elasticsearch服务时,如果没有实现创建好的专有网络可选择,则会默认创建一个专有网络。 开通好Elasticsearch服务之后,可能会遇到一个新的问题,即业务系统部署在经典网络的ECS中,默认是无法访问专有网络的,所以需要通过专有网络中提供的Classiclink 的功能,打通经典网络访问专有网络的链路。   完成上述步骤后,可以在业务系统所在的ECS上使用curl命令进行测试,也可以在阿里云Elasticsearch集成的Kibana控制台Dev Tools界面进行测试。 ### 食谱搜索系统设计 如上图所示,爬虫从网上抓取食谱数据,先经过关键词提取和加工,得到搜索源数据,然后通过索引构建器调用Elasticsearch提供的Rest API完成索引的创建。同时,提取出食材名称和食谱标签静态数据,用于后续搜索过程中,调Elasticsearch服务前的业务判断。 ### 数据准备及搜索场景设计 如下是一个典型的经过爬虫抓取、加工处理后用于搜索的食谱数据,索引构建器基于该数据结构创建索引和文档。 ```json  {     "recipeName": "水煮牛肉 ",                            //食谱名称     "mainFood": "莴笋尖,瘦牛肉",                          //主料     "subFood": "花椒面,菜籽油,豆瓣酱,蒜,鸡精",             //配料     "recipeTag": "肉类,川菜,朋友聚餐",                    //食谱标签     "viewNum": "3155800",                               //浏览次数     "cookingSpareTime": "10-30分钟"                     //烹饪耗时 } ``` 设计的搜索场景如下:      - 场景1,根据食谱名称精确匹配 输入    水煮牛肉 输出    水煮牛肉食谱 - 场景2,根据单个食材名称模糊匹配主料和配料,得到包含该食材的食谱列表 输入    牛肉 输出    相关食谱列表 - 场景3,根据多个名称组合,可能是食材名称/食谱名称/食谱标签,匹配相关食谱列表 输入    牛肉 川菜 输出    相关食谱列表 - 场景4,根据食谱标签匹配包含该标签的食谱列表 输入    川菜 输出    包含“川菜”标签的食谱列表 - 场景5,搜索出浏览次数TOP10的食谱 ### 索引创建 阿里云Elasticsearch默认关闭了自动创建索引功能,需要先创建好索引。索引的分析器使用阿里云Elasticsearch服务预置的IK Analyzer插件,该插件也是开源社区热门的中文分词分析器,结合食谱搜索的场景,使用ik_smart分析器对文本进行粗粒度的拆分。 根据搜索场景的需求,需要创建一个索引(Index),包含一个类型(Type),其中食谱名称(recipeName)、主要食材(mainFood)、辅助食材(subFood)、食谱标签(recipeTag)都是可被分词索引的,浏览次数(viewNum)可被索引但不进行分词,剩余不用于搜索的字段可不进行索引。 创建索引的命令如下: ```json curl -X PUT 'es-cn-xxx.elasticsearch.aliyuncs.com:9200/recipe' -d ' {   "mappings": {     "dish": {       "properties": {         "recipeName": {           "type": "string",           "index": "analyzed",           "analyzer": "ik_smart"         },         "mainFood": {           "type": "string",           "index": "analyzed",           "analyzer": "ik_smart"         },         "subFood": {           "type": "string",           "index": "analyzed",           "analyzer": "ik_smart"         },         "recipeTag": {           "type": "string",           "index": "analyzed",           "analyzer": "ik_smart"         },         "viewNum": {           "type": "integer",           "index": "not_analyzed"         },         "cookingSpareTime": {           "type": "string",           "index": "not_analyzed"         }       }     }   } }' ``` ### 索引文档创建 本文所设计的食谱搜索系统是一个实时的搜索系统,爬虫会不断的抓取数据,经过提取加工后由索引构建器调API创建文档,这样也能发挥ElasticSearch在实时搜索方面的优势。 如果有需要在ElasticSearch中大批量创建文档的需求,可以选择使用阿里云数据集成服务从OSS中抽取服务导入到ElasticSearch。 文档创建命令如下: ```json PUT 'es-cn-xxx.elasticsearch.aliyuncs.com:9200/recipe/dish/1' -d ' {     "subFood": "花椒面,菜籽油,豆瓣酱,蒜,鸡精",      "collectNum": "189919",      "mainFood": "莴笋尖,瘦牛肉",      "recipeName": "水煮牛肉 ",      "viewNum": "3155800",      "recipeTag": "肉类,川菜,朋友聚餐",     "cookingSpareTime": "10-30分钟" }'   ``` ### 搜索场景实现 ``` 场景1,根据食谱名称精确匹配     场景2,根据单个食材名称模糊匹配主料和配料,得到包含该食材的食谱列表     场景3,根据多个名称组合,可能是食材名称/食谱名称/食谱标签,匹配相关食谱列表 场景4,根据食谱标签匹配包含该标签的食谱列表 ``` 针对以上场景的需求,搜索后台的逻辑如下图所示: 各个场景下的搜索过程对应Elasticsearch执行命令分别如下: - 场景1. ```json GET 'es-cn-xxx.elasticsearch.aliyuncs.com:9200/recipe/dish/_search' -d ' {   "query" : { "term" : { "recipeName" : "水煮牛肉" }} }' ``` - 场景2. ```json GET 'es-cn-xxx.elasticsearch.aliyuncs.com:9200/recipe/dish/_search' -d ' {   "query" : {     "multi_match": {          "query":    "牛肉",          "fields":   [ "mainFood", "subFood" ]      }   } }' ``` - 场景3. ```json GET 'es-cn-xxx.elasticsearch.aliyuncs.com:9200/recipe/dish/_search' -d ' {   "query" : {     "multi_match": {          "query":    "牛肉 川菜",          "fields":   [ "recipeName", "mainFood", "subFood", "recipeTag" ]      }   } }' ``` - 场景4. ```json GET 'es-cn-xxx.elasticsearch.aliyuncs.com:9200/recipe/dish/_search' -d ' {   "query" : { "match" : { "recipeTag" : "川菜" }} }' ``` - 场景5,搜索出流量次数TOP100的食谱 该场景需要用到搜索排序,并指定搜索返回的记录数是100(默认为10)。 ```json GET 'es-cn-xxx.elasticsearch.aliyuncs.com:9200/recipe/dish/_search' -d ' {   "size": 100,   "sort": { "viewNum": { "order": "desc" } } }' ``` ##加入钉钉技术讨论群

dingQR

阿里云Elasticsearch已正式发布啦,Elastic开源官方联合开发,集成5.5商业版本XPack功能,欢迎开通使用。 [点击了解更多产品信息](https://data.aliyun.com/product/elasticsearch)

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
2天前
|
机器学习/深度学习 人工智能 运维
阿里云技术公开课直播预告:基于阿里云 Elasticsearch 构建 AI 搜索和可观测 Chatbot
阿里云技术公开课预告:Elastic和阿里云搜索技术专家将深入解读阿里云Elasticsearch Enterprise版的AI功能及其在实际应用。
阿里云技术公开课直播预告:基于阿里云 Elasticsearch 构建 AI 搜索和可观测 Chatbot
|
5天前
|
存储 人工智能 API
(Elasticsearch)使用阿里云 infererence API 及 semantic text 进行向量搜索
本文展示了如何使用阿里云 infererence API 及 semantic text 进行向量搜索。
|
1天前
|
搜索推荐 API 定位技术
一文看懂Elasticsearch的技术架构:高效、精准的搜索神器
Elasticsearch 是一个基于 Lucene 的开源搜索引擎,以其强大的全文本搜索功能和快速的倒排索引技术著称。它不仅支持数字、文本、地理位置等多类型数据,还提供了可调相关度分数、高级查询 DSL 等功能。Elasticsearch 的核心技术流程包括数据导入、解析、索引化、查询处理、得分计算及结果返回,确保高效处理大规模数据并提供准确的搜索结果。通过 RESTful API、Logstash 和 Filebeat 等工具,Elasticsearch 可以从多种数据源中导入和解析数据,支持复杂的查询需求。
12 0
|
1月前
|
存储 缓存 固态存储
Elasticsearch高性能搜索
【11月更文挑战第1天】
46 6
|
1月前
|
API 索引
Elasticsearch实时搜索
【11月更文挑战第2天】
45 1
|
2月前
|
人工智能
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
179 2
|
2月前
|
Web App开发 JavaScript Java
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
这篇文章是关于如何使用Spring Boot整合Elasticsearch,并通过REST客户端操作Elasticsearch,实现一个简单的搜索前后端,以及如何爬取京东数据到Elasticsearch的案例教程。
223 0
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
|
1月前
|
存储 安全 数据管理
如何在 Rocky Linux 8 上安装和配置 Elasticsearch
本文详细介绍了在 Rocky Linux 8 上安装和配置 Elasticsearch 的步骤,包括添加仓库、安装 Elasticsearch、配置文件修改、设置内存和文件描述符、启动和验证 Elasticsearch,以及常见问题的解决方法。通过这些步骤,你可以快速搭建起这个强大的分布式搜索和分析引擎。
43 5
|
2月前
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
216 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
|
3月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo

热门文章

最新文章

相关产品

  • 检索分析服务 Elasticsearch版
  • 下一篇
    DataWorks