使用Elasticsearch进行食谱搜索应用程序
我想使用Elasticsearch创建一个食谱搜索应用程序。
如果有一个能够从冰箱里剩下的食材中简单搜索食谱的应用就好了?
虽然使用食谱类的API也可以,但是条件很多,我倒是想试试用Elasticsearch?
1. 根据食材添加条件,进行搜索!
2. 在Elasticsearch中搜索条件!
3. 显示结果!(点击链接跳转到食谱网站)
首先,不尝试使用Elasticsearch是不能开始的!
Elasticsearch 是什么?
Elasticsearch是由Elastic公司开发的开源全文搜索引擎,能够快速从大量文档中提取包含目标单词的文档。
Elasticsearch通过使用RESTful接口来进行操作,而不使用SQL语句。
Elasticsearch 提供了几乎所有操作的 API,包括搜索、各种设置和服务器状态获取。
它还提供了添加、查询、更新和删除文档的 API,其规范非常简单和直观。
表示文档的URL模式
/{index}/{type}/{id}
基本上,可以使用GET、PUT、POST、DELETE和HEAD方法对各种文档的终端点进行添加、更新、删除等操作。
在Elasticsearch中,与关系型数据库(RDB)相比,术语有所不同。
首先,让我们在本地环境中尝试运行一下。
本地环境配置
-
- 使用バージョン
Elasticsearch 2.4.1
任意のディレクトリで以下実施
curl -L -O https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.4.1/elasticsearch-2.4.1.tar.gz
- elasticsearch-2.4.1.tar.gzを解凍
tar -xvf elasticsearch-2.4.1.tar.gz
- 解凍されたディレクトリの./bin配下で以下実施で起動
./elasticsearch
数据的录入 de
虽然原本计划通过API从批量等模式中获取配方的JSON数据,并自动将其注册到Elasticsearch中,但由于本次是在本地进行,所以为了学习兼顾,我们将选择手动进行数据注册。
生成索引(数据库)
curl -XPUT 'localhost:9200/refrigerator'
输入制作
curl -XPUT 'http://localhost:9200/refrigerator/_mapping/recipe' -d '
{
"properties" : {
"recipeId" : {
"type" : "long"
},
"recipeTitle" : {
"type" : "string"
},
"recipeUrl" : {
"type" : "string"
},
"foodImageUrl" : {
"type" : "string"
},
"recipeDescription" : {
"type" : "string"
},
"recipeMaterial" : {
"type" : "string"
}
}
}
菜谱记录注册
我已经注册了从楽天レシピAPI获取的菜谱(数据已经脱敏)。
curl -XPUT 'localhost:9200/refrigerator/recipe/1?pretty' -d '
{
"recipeId": xxxxxxxx,
"recipeTitle": "ダーリンが気に入った♪我が家のポークケチャップ",
"recipeUrl": "https://recipe.rakuten.co.jp/recipe/xxxxxxx/",
"foodImageUrl": "https://image.space.rakuten.co.jp/d/strg/ctrl/xxxxxxx",
"recipeDescription": "ダーリンが「美味しい」と喜んで食べてくれた、とっても簡単に出来るレシピです",
"recipeMaterial": [
"豚肉(こま切れ)",
"たまねぎ",
"ケチャップ",
"三温糖",
"ウスターソース"
]
}
“Column”, “Data” are the components.
* It is possible to write the syntax directly, but it is also possible to specify the content in a JSON file and use the file.
Example: curl -XPUT ‘http://[Endpoint]/[Index Name]/[Type Name]/[Id]’ -d ‘JSON data’
我会尝试实际搜索。
curl -XPOST 'localhost:9200/refrigerator/recipe/_search?pretty' -d '
{
"query": { "match": { "recipeMaterial": "たまねぎ 豚肉" } }
}
最後的結果
{"took":29,"timed_out":false,"_shards":{"total":1,"successful":1,"failed":0},"hits":{"total":1,"max_score":0.84996772,"hits":[{"_index":"refrigerator","_type":"recipe","_score":0.14996772,"_source":
{
"recipeId": xxxxxxxx,
"recipeTitle": "ダーリンが気に入った♪我が家のポークケチャップ",
"recipeUrl": "https://recipe.rakuten.co.jp/recipe/xxxxxxx/",
"foodImageUrl": "https://image.space.rakuten.co.jp/d/strg/ctrl/xxxxxxx",
"recipeDescription": "ダーリンが「美味しい」と喜んで食べてくれた、とっても簡単に出来るレシピです",
"recipeMaterial": [
"豚肉(こま切れ)",
"たまねぎ",
"ケチャップ",
"三温糖",
"ウスターソース"
]
}
在Elasticsearch中,它可以同时显示搜索时的性能。
由于max_score可以提供匹配率,因此在实际应用中,如果获取太多结果会很困扰,使用这个选项可能会得到更高的搜索结果。
找到了!
如果我们把这个条件输入到应用程序里,它应该会帮我们搜索到相应的食谱。
应用程序的实现
编程语言是C#,数据存储在Elasticsearch。
首先,請打開屏幕…
既然到了这个地步,我们会持续随时更新进一步开发的内容。
管理的范围
由于只接触过RDB,所以对Elasticsearch的通用性感到惊讶。
虽然这次在本地环境下处理的数据量很小,无法真正体会到它在性能方面处理大量数据时的便利之处。
听说还有一个名为Amazon Elasticsearch Service的服务,我想在服务器上注册并尝试一下。
我想充分利用这一点来开发一个冰箱菜谱应用程序。(虽然我根本不会做饭(小声说))
引述以下自然、简练准确的中文选项:
参考文章
- https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329