使用Elasticsearch搜索数据
本章节为您提供了一个通过CSS服务的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"}
]
}
视频介绍
步骤一:创建集群
创建一个非安全模式的Elasticsearch集群用于搜索数据。
- 登录云搜索服务管理控制台。
- 在左侧菜单栏选择 。
- 在集群列表右上角,单击“创建集群”,默认进入新版创建页面。
图1 新版创建页面
- 集群配置,选择集群类型和版本。
表1 集群配置 参数
示例
说明
集群类型
Elasticsearch
选择“Elasticsearch”。
集群版本
7.10.2
选择所需的集群版本,支持的版本以界面可选项为准。
Elasticsearch集群仅7.6.2和7.10.2版本自带CSS向量搜索引擎,如果要使用CSS向量数据库功能,则必须选择这两个版本。
- 基础配置,选择计费模式、当前区域和可用区。
表2 基础配置 参数
示例
说明
计费模式
按需计费
选择集群的计费模式,集群支持包年/包月和按需计费两种模式。
- 包年/包月:预付费模式,按照订单的购买周期结算。
- 按需计费:后付费模式,按照集群实际使用时长计费,计费周期为一小时,不足一小时按一小时计费。
当前区域
华北-北京四
选择集群的所在区域。区域指集群的物理数据中心所在的位置,不同区域的云服务产品之间内网互不相通。建议就近选择靠近您业务的区域,可减少网络时延,提高访问速度。
可用区
可用区1
选择集群工作区域下关联的可用区。可用区指在同一区域下,电力、网络隔离的物理区域,可用区之间内网互通,不同可用区之间物理隔离。
最多支持配置3个可用区。
- 配置数据节点。
数据节点用于存储集群数据,当集群未启用Master节点和Client节点时,数据节点将同时承担集群管理、存储数据、提供接入集群和分析数据的职责。此时,为保证集群中数据的稳定性,建议设置节点数量大于等于3个。图2 配置数据节点
表3 数据节点配置 参数
示例
说明
CPU架构
X86计算
选择数据节点的CPU架构。支持“X86计算”和“鲲鹏计算”,具体支持的类型由实际区域环境决定。
节点规格
ess.spec-4u8g
选择数据节点的规格。单击“选择节点规格”,在弹窗中选择合适的规格。
规格列表的“vCPUs | 内存”呈现了规格的CPU核数和内存,“建议存储范围”呈现了该规格支持的存储容量。
不同区域支持的节点规格不同,请以实际环境为准。
节点存储类型和容量
- 高I/O
- 40GB
选择数据节点的存储类型和容量。
- 当“节点规格”选择的是云硬盘时,需要选择云硬盘类型,并根据业务需要配置存储容量。
- 不同区域支持的云硬盘类型不同,请以实际环境为准。
- 节点存储容量的取值范围由所选的“节点规格”决定,且必须是20的倍数。
- 节点存储容量不支持就地缩容,请评估好业务量,合理选择。
- 当“节点规格”选择的是本地盘时,无需配置节点存储类型,节点存储容量是固定值,由选择的本地盘规格决定。
节点数量
1
设置集群中的数据节点个数。
- 当集群配置了Master节点,则数据节点的节点数量支持1~200。
- 当集群未配置Master节点,则数据节点的节点数量支持1~32。
- 建议数据节点的节点数量大于或等于3,以提升集群可用性。
- Master节点、Client节点和冷数据节点均保持默认值,不启用即可。
- Master节点负责管理集群中所有节点任务,如集群元数据、索引及分片分配,保障大规模集群稳定运行,适用于需高可用性与集中管控的场景。
- Client节点负责接收并协调外部请求(如搜索和写入),优化高负载查询和集群扩展性,适用于处理复杂查询和大规模分片场景。
- 冷数据节点用于存储查询时延要求不高且数据量大的历史数据,适用于大规模数据集存储,有利于优化存储成本和查询性能。
- 网络配置,设置集群的VPC、IP地址和安全组。
图3 网络配置
表4 网络配置 参数
示例
说明
虚拟私有云
vpc-default
指定集群使用的虚拟专用网络,可以对不同业务进行网络隔离
子网
subnet-default
指定集群使用的子网,通过子网提供与其他网络隔离的、可以独享的网络资源,以提高网络安全。
选择当前虚拟私有云下的子网。
IPv4地址
自动分配IPv4地址
分配集群节点的IPv4地址。
安全组
default
指定集群使用的安全组,安全组起着虚拟防火墙的作用,为集群提供安全的网络访问控制策略。
所选安全组的入方向规则中,“协议端口”必须为“全部”或包含9200的端口范围,否则外部业务访问可能会异常。
- 安全模式配置。关闭安全模式,本集群仅做入门指导使用,无需启用安全模式。
- 安全模式的集群会对集群进行通讯加密和安全认证。
- 非安全模式的集群无需安全认证即可访问,并且采用HTTP明文传输数据。建议确认访问环境的安全性,勿将访问接口暴露到公网环境上。
- 集群管理配置,设置集群名称、企业项目等信息。
表5 集群管理 参数
示例
说明
集群名称
Sample-ESCluster
自定义集群名称。
集群名称在4位到32位之间,必须以字母开头,可以包含字母、数字、中划线或者下划线,不能包含其他的特殊字符。
企业项目
default
给集群绑定一个企业项目。
企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理,默认项目为“default”。
如果开通了“企业项目”,请从下拉列表中选择所在的企业项目。
标签
不添加
为集群添加标签,方便用户识别和管理拥有的集群资源。
每个集群最多可以设置20个标签。
- 设置集群自动备份快照。关闭自动创建集群快照,本集群仅做入门指导使用,无需备份快照。
- 终端节点服务等均保持默认值,不启用即可。
- 单击“立即创建”,开始创建集群。
- 返回集群列表,查看新建的集群。当集群创建成功后,“集群状态”会变为“可用”。
图4 查看集群状态
步骤二:登录Kibana
集群创建成功后,通过Kibana访问Elasticsearch集群。
- 在Elasticsearch集群列表,选择已创建的“Sample-ESCluster”集群,单击操作列中的“Kibana”进入Kibana控制台。
- 在Kibana的左侧导航中选择“Dev Tools”,进入Console界面。
步骤三:创建索引
在Elasticsearch集中创建索引,存储数据。
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"
}
步骤四:导入数据
Elasticsearch集群支持通过多种方式导入数据,本示例选择在Kibana使用开源Elasticsearch API导入数据。
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”时,表示导入数据成功。
步骤五:搜索数据
在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 } ] } } }
步骤六:删除索引
当不再使用对应的索引数据时,可以在Kibana中执行如下命令删除对应索引,避免造成资源浪费。
DELETE /my_store
返回结果如下所示。
{
"acknowledged" : true
}
后续步骤
已完成数据搜索业务,无需继续使用集群时,可删除集群释放资源。
由于集群删除后,数据无法恢复,请谨慎操作。
- 登录云搜索服务管理控制台。
- 在左侧菜单栏选择 。
- 在集群列表,选择“Sample-ESCluster”集群,在操作列单击“更多”>“删除”。
- 在弹出的确认对话框中,输入“DELETE”,单击“确定”完成操作。
相关文档
- 了解如何访问Elasticsearch集群,请参见Elasticsearch集群访问方式。
- 了解如何优化OpenSearch集群性能,请参见优化Elasticsearch和OpenSearch集群写入性能。
- 了解如何将Elasticsearch迁移至华为云,请参见Elasticsearch集群数据迁移方案介绍。