
# 使用Elasticsearch搜索数据
本章节为您提供了一个通过CSS服务的Elasticsearch集群完成商品搜索的示例，您可以参考此示例来了解云搜索服务，包括创建索引、导入数据、搜索数据等操作。
#### 场景描述
某女装品牌在网上经营电商业务，以前使用传统数据库来为用户提供商品搜索功能，但随着用户数量和业务的增长，使用传统数据库的弊端愈来愈明显。主要问题表现为响应速度慢、准确性低。为了改善用户体验从而避免用户流失，该电商网站开始使用云搜索服务为用户提供商品搜索功能，不仅解决了之前使用传统数据库产生的问题，而且实现了用户数量的增长。
假设该电商网站经营商品的数据如[表1]所示。
 表1某电商网站经营的商品 
| productName    | size |
|:---|:---|
| 2017秋装新款文艺衬衫女装 | L    |
| 2017秋装新款文艺衬衫女装 | M    |
| 2017秋装新款文艺衬衫女装 | S    |
| 2018春装新款牛仔裤女装  | M    |
| 2018春装新款牛仔裤女装  | S    |
| 2017春装新款休闲裤女装  | L    |
| 2017春装新款休闲裤女装  | S    |
   
#### 操作视频
本视频演示了在CSS服务中使用Elasticsearch进行数据检索的操作流程，旨在帮助您了解如何在CSS集群中导入数据并通过Elasticsearch的搜索API实现高效的数据查询与分析。
因不同版本操作界面可能存在差异，相关视频供参考，具体以实际环境为准。
<video controls="controls" preload="none" id="object4959154142816" class="idp-external-video" src="https://res-video.hc-cdn.com/cloudbu-site/china/zh-cn/support/css-video/Using_Elasticsearch_for_Data_Search_CN.mp4" title="使用Elasticsearch搜索数据" poster="https://support.huaweicloud.com/qs-css/figure/zh-cn_image_0000002615794347.jpg" height="300.0000" width="600.0000"></video>
#### 操作流程
以下是使用Elasticsearch集群完成数据搜索的操作步骤。
开始使用集群前，请务必按[准备工作]指导完成必要操作。
1. [步骤一：创建集群]：创建一个Elasticsearch非安全集群用于搜索数据。
2. [步骤二：登录Kibana]：登录Kibana，访问集群。
3. [步骤三：创建索引]：在Kibana中给集群创建索引。
4. [步骤四：导入数据]：在Kibana中使用开源Elasticsearch API导入数据。
5. [步骤五：搜索数据]：在Elasticsearch集群中对数据进行全文检索和聚合结果显示。
6. [步骤六：删除索引]：当不再使用对应的索引数据时，可以删除对应索引节约资源。
 
 #### 准备工作
已注册华为账号并开通华为云，进行了实名认证，且在使用云搜索服务前检查账号状态，账号不能处于欠费或冻结状态。
如果您还没有华为账号，请参考以下步骤创建。
1. 打开[华为云网站](https://www.huaweicloud.com/)。
2. 在页面右上角单击"注册"，根据提示信息完成注册。
3. 勾选服务条款， 单击"开通"。
4. 实名认证，请参考：
   - 个人账号：[实名认证](https://support.huaweicloud.com/usermanual-account/zh-cn_topic_0077914254.html)
   
   - 企业账号：[实名认证](https://support.huaweicloud.com/usermanual-account/zh-cn_topic_0077914253.html)
    
 
 #### 步骤一：创建集群
创建一个非安全模式的Elasticsearch集群用于搜索数据。
1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
2. 在左侧导航栏选择"集群管理 \> Elasticsearch"。
3. 在集群列表右上角，单击"创建集群"，默认进入新版创建页面。
   图1新版创建页面   
   ![](https://support.huaweicloud.com/qs-css/figure/zh-cn_image_0000002361844584.png "点击放大") 
4. 集群配置，选择集群类型和版本。
   表2集群配置 
   | 参数   | 示例                | 说明                                                                                                                                           |
   |:---|:---|:---|
   | 集群类型 | **Elasticsearch** | 选择"Elasticsearch"。                                                                                                                           |
   | 集群版本 | **7.10.2**        | 选择所需的集群版本，支持的版本以界面可选项为准。 Elasticsearch集群仅7.6.2和7.10.2版本自带CSS向量搜索引擎，如果要使用CSS向量数据库功能，则必须选择这两个版本。 |
      
   
5. 基础配置，选择当前区域、可用区和计费模式。
   表3基础配置 
   | 参数   | 示例         | 说明                                                                                                                                                                                                                                                                                                                                                                                                         |
   |:---|:---|:---|
   | 当前区域 | **华北-北京四** | 选择集群的所在区域。区域指集群的物理数据中心所在的位置，不同区域的云服务产品之间内网互不相通。建议就近选择靠近您业务的区域，可减少网络时延，提高访问速度。                                                                                                                                                                                                                                                                                                                              |
   | 可用区  | **可用区1**   | 选择集群工作区域下关联的可用区。可用区指在同一区域下，电力、网络隔离的物理区域，可用区之间内网互通，不同可用区之间物理隔离。 最多支持配置3个可用区。                                                                                                                                                                                                                                                                                 |
   | 计费模式 | **按需计费**   | 选择集群的计费模式，集群支持包年/包月和按需计费两种模式。 - **包年/包月**：预付费模式，按照订单的购买周期结算。  - **按需计费**：后付费模式，按照集群实际使用时长计费，计费周期为一小时，不足一小时按一小时计费。   |
      
   
6. 配置数据节点。
   数据节点用于存储集群数据，当集群未启用Master节点和Client节点时，数据节点将同时承担集群管理、存储数据、提供接入集群和分析数据的职责。
   图2配置数据节点   
   ![](https://support.huaweicloud.com/qs-css/figure/zh-cn_image_0000002328380009.png "点击放大")
   表4数据节点配置 
   | 参数        | 示例                                                                                                                                                                                                                                                                  | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
   |:---|:---|:---|
   | CPU架构     | **X86计算**                                                                                                                                                                                                                                                           | 选择数据节点的CPU架构。支持"X86计算"和"鲲鹏计算"，具体支持的类型由实际区域环境决定。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   | 节点规格      | **ess.spec-4u8g**                                                                                                                                                                                                                                                   | 选择数据节点的规格。单击"选择节点规格"，在弹框中选择合适的规格。 规格列表的"vCPUs \| 内存"呈现了规格的CPU核数和内存，"建议存储范围"呈现了该规格支持的存储容量。 不同区域支持的节点规格不同，请以实际环境为准。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   | 节点存储类型和容量 | - **高I/O**  - **100GB**   | 选择数据节点的存储类型和容量。 - 当"节点规格"选择的是云硬盘时，需要选择云硬盘类型，并根据业务需要配置存储容量。 - 不同区域支持的云硬盘类型不同，请以实际环境为准。  - 节点存储容量的取值范围由所选的"节点规格"决定，且必须是20的倍数。  - 节点存储容量不支持就地缩容，请评估好业务量，合理选择。    - 当"节点规格"选择的是本地盘时，无需配置节点存储类型，节点存储容量是固定值，由选择的本地盘规格决定。   |
   | 节点数量      | **1**                                                                                                                                                                                                                                                               | 设置集群中的数据节点个数。 - 当集群配置了Master节点，则数据节点的节点数量支持1\~200。  - 当集群未配置Master节点，则数据节点的节点数量支持1\~32。  - 建议数据节点的节点数量大于或等于3，以提升集群可用性。                                                                                                                                                                                                                                                                                                                                                                 |
      
   
7. Master节点、Client节点和冷数据节点均保持默认值，不启用即可。
   - Master节点负责管理集群中所有节点任务，如集群元数据、索引及分片分配，保障大规模集群稳定运行，适用于需高可用性与集中管控的场景。
   
   - Client节点负责接收并协调外部请求（如搜索和写入），优化高负载查询和集群扩展性，适用于处理复杂查询和大规模分片场景。
   
   - 冷数据节点用于存储查询时延要求不高且数据量大的历史数据，适用于大规模数据集存储，有利于优化存储成本和查询性能。
    
8. 网络配置，设置集群的VPC、IP地址和安全组。
   图3网络配置   
   ![](https://support.huaweicloud.com/qs-css/figure/zh-cn_image_0000002328404261.png "点击放大")
   表5网络配置 
   | 参数     | 示例                 | 说明                                                                                                                                           |
   |:---|:---|:---|
   | 虚拟私有云  | **vpc-default**    | 指定集群使用的虚拟专用网络，可以对不同业务进行网络隔离                                                                                                                  |
   | 子网     | **subnet-default** | 指定集群使用的子网，通过子网提供与其他网络隔离的、可以独享的网络资源，以提高网络安全。 选择当前虚拟私有云下的子网。                                       |
   | IPv4地址 | **自动分配IPv4地址**     | 分配集群节点的IPv4地址。                                                                                                                               |
   | 安全组    | **default**        | 指定集群使用的安全组，安全组起着虚拟防火墙的作用，为集群提供安全的网络访问控制策略。 所选安全组的入方向规则中，"协议端口"必须为"全部"或包含9200的端口范围，否则外部业务访问可能会异常。 |
      
   
9. 安全模式配置。关闭安全模式，本集群仅做入门指导使用，无需启用安全模式。
   - 安全模式的集群会对集群进行通讯加密和安全认证。
   
   - 非安全模式的集群无需安全认证即可访问，并且采用HTTP明文传输数据。建议确认访问环境的安全性，勿将访问接口暴露到公网环境上。
    
10. 集群管理配置，设置集群名称、企业项目等信息。
    表6集群管理 
    | 参数   | 示例                   | 说明                                                                                                                                                                                                           |
    |:---|:---|:---|
    | 集群名称 | **Sample-ESCluster** | 自定义集群名称。                                                                                                                                                                                                     |
    | 添加描述 | **不添加**              | 为集群添加描述，方便用户识别。                                                                                                                                                                                              |
    | 企业项目 | **default**          | 给集群绑定一个企业项目。 企业项目是一种云资源管理方式，企业项目管理服务提供统一的云资源按项目管理，以及项目内的资源管理、成员管理，默认项目为"default"。 如果开通了"企业项目"，请从下拉列表中选择所在的企业项目。 |
    | 标签   | **不添加**              | 为集群添加标签，方便用户识别和管理拥有的集群资源。 每个集群最多可以设置20个标签。                                                                                                                     |
       
    
11. 更多配置，单击![](https://support.huaweicloud.com/qs-css/figure/zh-cn_image_0000002385381466.png)展开更多集群高级配置，根据业务需要设置自动创建集群快照、终端节点服务等功能。本集群仅做入门指导使用，无需更多配置，保持默认不启用即可。
12. 单击"立即创建"，开始创建集群。
13. 返回集群列表，查看新建的集群。当集群创建成功后，"集群状态"会变为"可用"。
    图4查看集群状态   
    ![](https://support.huaweicloud.com/qs-css/figure/zh-cn_image_0000002294363734.png "点击放大") 
 
 #### 步骤二：登录Kibana
集群创建成功后，通过Kibana访问Elasticsearch集群。
1. 在Elasticsearch集群列表，选择已创建的"Sample-ESCluster"集群，单击操作列中的"Kibana"进入Kibana控制台。
2. 在Kibana的左侧导航中选择"Dev Tools"，进入Console界面。
   控制台左侧是命令输入框，其右侧的三角形图标为执行按钮，右侧区域则显示执行结果。
   图5Console界面   
   ![](https://support.huaweicloud.com/qs-css/figure/zh-cn_image_0000002295063054.png "点击放大") 
 
 #### 步骤三：创建索引
在Elasticsearch集群中创建索引，存储数据。
在Kibana中执行如下命令，创建索引"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"
}
```
 #### 步骤四：导入数据
Elasticsearch集群支持通过多种方式导入数据，本示例选择在Kibana使用开源Elasticsearch API导入数据。
在Kibana中执行如下命令，将数据导入到"my_store"索引中。
```
POST /my_store/_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
}
```
#### 后续步骤
已完成数据搜索业务，无需继续使用集群时，可删除集群释放资源。
![](https://support.huaweicloud.com/qs-css/public_sys-resources/warning_3.0-zh-cn.png)
由于集群删除后，数据无法恢复，请谨慎操作。
1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
2. 在左侧导航栏选择"集群管理 \> Elasticsearch"。
3. 在集群列表，选择"Sample-ESCluster"集群，在操作列单击"更多"\>"删除"。
4. 在弹出的确认对话框中，输入"DELETE"，单击"确定"完成操作。
 
#### 相关文档
- 了解如何访问Elasticsearch集群，请参见[Elasticsearch集群访问方式](https://support.huaweicloud.com/usermanual-css/css_01_0190.html)。
- 了解如何优化Elasticsearch集群性能，请参见[优化Elasticsearch和OpenSearch集群写入性能](https://support.huaweicloud.com/bestpractice-css/css_07_0018.html)。
- 了解如何将Elasticsearch迁移至华为云，请参见[Elasticsearch集群数据迁移方案介绍](https://support.huaweicloud.com/bestpractice-css/css_07_0007.html)。
 
