快速开始使用Elasticsearch搜索引擎
本章节提供了一个简单示例:使用Elasticsearch搜索引擎来为用户提供商品搜索功能。您可以参考此场景示例数据,使用云搜索服务的Elasticsearch搜索引擎搜索数据,基本操作流程如下所示:
场景描述
某女装品牌在网上经营电商业务,其以前是使用传统数据库来为用户提供商品搜索功能,但随着用户数量和业务的增长,使用传统数据库的弊端愈来愈明显。主要问题表现为:响应速度慢、准确性低。为了改善用户体验从而避免用户流失,该电商网站开始使用Elasticsearch搜索引擎来为用户提供商品搜索功能,使用了一段时间后,不仅解决了之前使用传统数据库产生的问题,而且实现了用户数量的增长。
本章节将介绍如何使用Elasticsearch搜索引擎为用户提供搜索功能。
假设该电商网站经营商品的数据如下所示:
{ "products":[ {"productName":"2017秋装新款文艺衬衫女装","size":"L"} {"productName":"2017秋装新款文艺衬衫女装","size":"M"} {"productName":"2017秋装新款文艺衬衫女装","size":"S"} {"productName":"2018春装新款牛仔裤女装","size":"M"} {"productName":"2018春装新款牛仔裤女装","size":"S"} {"productName":"2017春装新款休闲裤女装","size":"L"} {"productName":"2017春装新款休闲裤女装","size":"S"} ] }
步骤1:创建集群
在开始搜索数据之前,您需要创建一个集群,其搜索引擎为Elasticsearch。例如,您可以创建一个名称为“Sample-ESCluster”的集群。此集群仅用于入门指导使用,建议选用“节点规格”为“ess.spec-4u8g”,“节点存储”为“高I/O”,“节点存储容量”为“40GB”。详细操作步骤请参见创建Elasticsearch类型集群(非安全模式)。
在开始搜索数据之前,您需要创建一个集群,其搜索引擎为Elasticsearch。例如,您可以创建一个名称为“Sample-ESCluster”的集群。此集群仅用于入门指导使用,建议选用“节点规格”为“ess.spec-4u8g”,“节点存储”为“高I/O”,“节点存储容量”为“40GB”。详细操作步骤请参见创建Elasticsearch类型集群(安全模式)或创建Elasticsearch类型集群(非安全模式)。
集群创建完成后,在集群列表查看已创建的集群,集群状态为“可用”表示集群创建成功。
步骤2:导入数据
云搜索服务支持通过Logstash、Kibana或API将数据导入到Elasticsearch。其中Kibana是Elasticsearch的图形化界面,便于交互验证,因此,这里以Kibana为例介绍将数据导入到Elasticsearch的操作流程。
- 在“集群管理”页面选择需要登录的集群,单击“操作”列中的“Kibana”进入Kibana登录界面。
- 非安全模式的集群:将直接进入Kibana操作界面。
- 安全模式的集群:需要在登录页面输入用户名和密码,单击“Log In”进入Kibana操作界面。用户名默认为admin,密码为创建集群时设置的管理员密码。
- 在Kibana的左侧导航中选择“Dev Tools”,进入Console界面,如图1所示。
Console左侧区域为输入框,输入框右侧的三角形为执行命令按钮;Console右侧为结果输出区域。
不同版本的Kibana界面会有细微差别,请以实际环境为准。
- 在Console界面,执行如下命令创建索引“my_store”。
(7.x之后版本)
PUT /my_store { "settings": { "number_of_shards": 1 }, "mappings": { "properties": { "productName": { "type": "text", "analyzer": "ik_smart" }, "size": { "type": "keyword" } } } }
返回结果如下所示。
{ "acknowledged" : true, "shards_acknowledged" : true, "index" : "my_store" }
- 在Console界面,执行如下命令,将数据导入到“my_store”索引中。
(7.x之后版本)
POST /my_store/_doc/_bulk {"index":{}} {"productName":"2017秋装新款文艺衬衫女装","size":"L"} {"index":{}} {"productName":"2017秋装新款文艺衬衫女装","size":"M"} {"index":{}} {"productName":"2017秋装新款文艺衬衫女装","size":"S"} {"index":{}} {"productName":"2018春装新款牛仔裤女装","size":"M"} {"index":{}} {"productName":"2018春装新款牛仔裤女装","size":"S"} {"index":{}} {"productName":"2017春装新款休闲裤女装","size":"L"} {"index":{}} {"productName":"2017春装新款休闲裤女装","size":"S"}
当返回结果信息中“errors”字段的值为“false”时,表示导入数据成功。
步骤3:搜索数据
- 全文检索
假设用户进入该电商网站,她想要查找名称包含“春装牛仔裤”的商品信息,可以搜索“春装牛仔裤”。这里使用Kibana演示用户搜索数据在后台的执行命令和返回结果。
执行命令如下所示。
(7.x之后版本)
GET /my_store/_search { "query": {"match": { "productName": "春装牛仔裤" }} }
返回结果如下所示。
{ "took" : 3, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 4, "relation" : "eq" }, "max_score" : 1.7965372, "hits" : [ { "_index" : "my_store", "_type" : "_doc", "_id" : "9xf6VHIBfClt6SDjw7H5", "_score" : 1.7965372, "_source" : { "productName" : "2018春装新款牛仔裤女装", "size" : "M" } }, { "_index" : "my_store", "_type" : "_doc", "_id" : "-Bf6VHIBfClt6SDjw7H5", "_score" : 1.7965372, "_source" : { "productName" : "2018春装新款牛仔裤女装", "size" : "S" } }, { "_index" : "my_store", "_type" : "_doc", "_id" : "-Rf6VHIBfClt6SDjw7H5", "_score" : 0.5945667, "_source" : { "productName" : "2017春装新款休闲裤女装", "size" : "L" } }, { "_index" : "my_store", "_type" : "_doc", "_id" : "-hf6VHIBfClt6SDjw7H5", "_score" : 0.5945667, "_source" : { "productName" : "2017春装新款休闲裤女装", "size" : "S" } } ] } }
- Elasticsearch支持分词,上面执行命令会将“春装牛仔裤”分词为“春装”和“牛仔裤”。
- Elasticsearch支持全文检索,上面执行命令会在所有商品信息中搜索包含“春装”或“牛仔裤”的商品信息。
- Elasticsearch与传统数据库不同,它能借助倒排索引在毫秒级返回结果。
- Elasticsearch支持评分排序,在上面返回结果中,前两条商品信息中同时出现了“春装”和“牛仔裤”,后两条商品信息中只出现了“春装”,所以前两条比后两条与检索关键词的匹配度更高,分数更高,排序也更靠前。
- 聚合结果显示
该电商网站可以提供聚合结果显示功能,例如: 对“春装”对应的产品按照尺码分类,统计不同尺码的数量。这里使用Kibana演示聚合结果显示功能在后台的执行命令和返回结果。
执行命令如下所示。
(7.x之后版本)
GET /my_store/_search { "query": { "match": { "productName": "春装" } }, "size": 0, "aggs": { "sizes": { "terms": { "field": "size" } } } }
返回结果如下所示。
(7.x之后版本 )
{ "took" : 3, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 4, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "sizes" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "S", "doc_count" : 2 }, { "key" : "L", "doc_count" : 1 }, { "key" : "M", "doc_count" : 1 } ] } } }