使用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非安全集群用于搜索数据。
- 登录云搜索服务管理控制台。
- 在左侧菜单栏选择 。
- 单击右上角的“创建集群”,进入“创建集群”页面。
- 配置集群的计费模式和可用区。
表1 计费模型和可用区参数说明 参数
说明
取值样例
计费模式
集群支持“包年/包月”和“按需计费”两种模式。
- 包年/包月:根据集群购买时长,一次性支付集群费用。最短时长为1个月,最长时长为3年。如果购买时长超过9个月,建议包年购买,价格更优惠。
- 按需计费:按实际使用时长计费,计费周期为一小时,不足一小时按一小时计费。
按需计费
当前区域
选择集群的所在区域。
不同区域的云服务产品之间内网互不相通。请就近选择靠近您业务的区域,可减少网络时延,提高访问速度。
中国-香港
可用区
选择集群工作区域下关联的可用区。最多支持配置3个“可用区”。
可用区1
- 配置集群基本信息。
图1 配置集群信息
表2 基本参数说明 参数
说明
取值样例
集群类型
选择“Elasticsearch”。
Elasticsearch
集群版本
选择所需的集群版本,支持的版本以界面可选项为准。
7.10.2
集群名称
自定义集群名称,可输入的字符范围为4~32个字符,只能包含数字、字母、中划线和下划线,且必须以字母开头。
Sample-ESCluster
- 配置集群的规格信息。
图2 配置集群规格
表3 规格参数说明 参数
说明
取值样例
节点数量
设置集群中的数据节点个数。可选节点数为1~32。
1
CPU架构
具体支持的类型由实际区域环境决定。
X86计算
节点规格
选择集群节点的规格。
ess.spec-4u8g
节点存储
选择集群节点的存储类型。
高I/O
节点存储容量
设置集群节点的存储空间大小,其取值范围与节点规格关联,不同的规格允许的取值范围不同。节点存储容量只支持配置为20的倍数。
40GB
启用Master节点
Master节点负责管理集群中所有节点任务。
不勾选
启用Client节点
Client节点负责接收并协调外部请求,如search和write请求。
不勾选
启用冷数据节点
冷数据节点用于存储对查询时延要求不高,但数据量较大的历史数据。
不勾选
- 设置集群的企业项目。
- 单击“下一步:网络配置”,设置集群的网络配置。
图3 配置网络
表4 网络配置参数说明 参数
说明
取值样例
虚拟私有云
指定集群节点使用的虚拟专用网络,实现不同业务的网络隔离。
说明:此处您选择的VPC必须包含网段(CIDR),否则集群将无法创建成功。新建的VPC默认包含网段(CIDR)。
vpc-default
子网
集群使用子网实现与其他网络的隔离,并独享所有网络资源,以提高网络安全。
subnet-default
安全组
安全组起着虚拟防火墙的作用,为集群提供安全的网络访问控制策略。
说明:为了确保您能够正常访问集群,需要放通安全组9200规则。
default
安全模式
集群支持选择是否开启安全模式,开启之后将对集群进行通讯加密和安全认证。
关闭
- 单击“下一步:高级配置”,可以设置集群自动快照和其他高级功能。
- 单击“下一步:确认配置”,确认完成后单击“立即创建”开始创建集群。
- 单击“返回集群列表”,系统将跳转到“集群管理”页面。您创建的集群将展现在集群列表中,且集群状态为“创建中”,创建成功后集群状态会变为“可用”。
图4 创建集群
步骤2:导入数据
Elasticsearch集群支持通过多种方式导入数据,本示例选择在Kibana使用开源Elasticsearch API导入数据。
- 在Elasticsearch集群管理页面,选择已创建的“Sample-ESCluster”集群,单击操作列中的“Kibana”进入Kibana控制台。
- 在Kibana的左侧导航中选择“Dev Tools”,进入Console界面。
- 在Console界面,执行如下命令创建索引“my_store”。
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”索引中。
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:搜索数据
在Elasticsearch集群中对数据进行全文检索和聚合结果显示。
- 全文检索
假设用户进入该电商网站,她想要查找名称包含“春装牛仔裤”的商品信息,可以搜索“春装牛仔裤”。
在Kibana执行如下搜索命令。
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支持IK分词,上面执行命令会将“春装牛仔裤”分词为“春装”和“牛仔裤”。
- Elasticsearch支持全文检索,上面执行命令会在所有商品信息中搜索包含“春装”或“牛仔裤”的商品信息。
- Elasticsearch与传统数据库不同,它能借助倒排索引在毫秒级返回结果。
- Elasticsearch支持评分排序,在上面返回结果中,前两条商品信息中同时出现了“春装”和“牛仔裤”,后两条商品信息中只出现了“春装”,所以前两条比后两条与检索关键词的匹配度更高,分数更高,排序也更靠前。
- 聚合结果显示
该电商网站可以提供聚合结果显示功能,例如: 对“春装”对应的产品按照尺码分类,统计不同尺码的数量。
在Kibana执行如下聚合结果命令。
GET /my_store/_search { "query": { "match": { "productName": "春装" } }, "size": 0, "aggs": { "sizes": { "terms": { "field": "size" } } } }
返回结果如下所示。
{ "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 } ] } } }
步骤4:删除索引
当不再使用对应的索引数据时,可以在Kibana执行如下命令删除对应索引,避免造成资源浪费。
DELETE /my_store
返回结果如下所示。
{ "acknowledged" : true }
后续操作
已完成数据搜索业务,无需继续使用集群时,可删除集群释放资源。
由于集群删除后,数据无法恢复,请谨慎操作。
- 登录云搜索服务管理控制台。
- 在左侧菜单栏选择 。
- 在集群列表,选择“Sample-ESCluster”集群,在操作列单击“更多”>“删除”。
- 在弹出的确认对话框中,输入“DELETE”,单击“确定”完成操作。