Elasticsearch 实战应用:从入门到项目集成

lasticsearch 作为一个分布式搜索和分析引擎,已经被广泛应用于日志处理、数据搜索、实时分析等场景。本文将带你了解 Elasticsearch 的基本概念,并通过一个实际案例展示如何将其集成到项目中。

一、Elasticsearch 简介

1.1 什么是 Elasticsearch?

Elasticsearch 是一个基于 Apache Lucene 的分布式搜索引擎。它提供了强大的全文搜索、近实时的索引和搜索功能,广泛应用于日志分析、数据监控、数据分析等场景。

1.2 核心概念

在使用 Elasticsearch 之前,理解以下几个核心概念至关重要:

  • 索引 (Index):类似于关系型数据库中的"数据库",是 Elasticsearch 存储和查询数据的地方。
  • 文档 (Document):Elasticsearch 中的数据单位,相当于关系型数据库中的一行数据。
  • 类型 (Type):文档的分类,虽然在 Elasticsearch 7.x 版本以后逐步被移除,但它在早期版本中用于对不同文档进行区分。
  • 节点 (Node):集群中的一个运行实例,集群可以包含多个节点,每个节点存储数据并参与索引和查询处理。

1.3 使用场景

Elasticsearch 可以用于以下场景:

  • 日志分析:结合 Logstash 和 Kibana,形成 ELK 堆栈,用于收集、分析和可视化日志数据。
  • 全文搜索:为网站或应用提供搜索功能,支持模糊搜索、近似匹配等功能。
  • 实时分析:利用 Elasticsearch 的强大分析功能,快速处理大量数据,实现实时监控和分析。

二、安装与配置

2.1 安装 Elasticsearch

在开始项目之前,首先需要在本地或服务器上安装 Elasticsearch。

使用 Docker 安装
bash 复制代码
docker pull elasticsearch:7.10.0
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.10.0
本地安装

可以从Elasticsearch官网下载最新版本的安装包,并根据操作系统选择适合的版本进行安装。

2.2 基本配置

Elasticsearch 的默认配置文件位于 config/elasticsearch.yml。其中几个关键的配置项包括:

bash 复制代码
cluster.name: my-cluster
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
  • cluster.name:定义集群的名称。
  • node.name:定义节点的名称。
  • network.host:指定网络绑定的地址。
  • http.port:指定 HTTP 服务的端口,默认是9200。

配置完毕后,启动 Elasticsearch:

bash 复制代码
./bin/elasticsearch

三、实战案例:商品搜索功能

3.1 场景描述

在一个电商网站中,我们需要为用户提供商品的搜索功能,要求支持关键字匹配、模糊查询和结果分页。为此,我们将利用 Elasticsearch 的全文搜索功能实现这个需求。

3.2 数据建模

首先,我们需要为商品数据建立索引。在 Elasticsearch 中,我们可以使用 JSON 格式来定义索引的结构。

创建索引
bash 复制代码
PUT /products
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "description": {
        "type": "text"
      },
      "price": {
        "type": "float"
      },
      "in_stock": {
        "type": "boolean"
      }
    }
  }
}
复制代码
这里定义了一个 products索引,包含以下字段:
  • name:商品名称,使用 text 类型进行全文检索。
  • description:商品描述,使用 text 类型。
  • price:商品价格,使用 float 类型。
  • in_stock:库存状态,使用 boolean 类型。

3.3 数据导入

接下来我们导入一些商品数据到 Elasticsearch。

bash 复制代码
POST /products/_doc/1
{
  "name": "iPhone 12",
  "description": "Apple iPhone 12 with 64GB storage",
  "price": 799.99,
  "in_stock": true
}

POST /products/_doc/2
{
  "name": "Samsung Galaxy S21",
  "description": "Samsung Galaxy S21 with 128GB storage",
  "price": 999.99,
  "in_stock": true
}

3.4 搜索功能实现

接下来实现关键字搜索功能。用户可以根据商品名称或描述进行搜索,我们通过 Elasticsearch 的 match 查询实现。

bash 复制代码
GET /products/_search
{
  "query": {
    "match": {
      "name": "iPhone"
    }
  }
}

上面的查询将返回包含"iPhone"关键字的商品列表。

模糊查询

假设用户输入了拼写错误的关键字,例如"iPohne",我们可以使用 fuzziness 参数进行模糊搜索。

bash 复制代码
GET /products/_search
{
  "query": {
    "match": {
      "name": {
        "query": "iPohne",
        "fuzziness": "AUTO"
      }
    }
  }
}
分页查询

为了实现结果分页,我们可以在搜索请求中添加 fromsize 参数:

bash 复制代码
GET /products/_search
{
  "query": {
    "match": {
      "name": "Galaxy"
    }
  },
  "from": 0,
  "size": 10
}

这将返回从第0个文档开始的10条记录。

3.5 结合Java项目使用

为了在Java项目中集成 Elasticsearch,我们可以使用官方提供的 Elasticsearch Java REST 客户端。

Maven依赖

pom.xml 中添加如下依赖:

java 复制代码
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.10.0</version>
</dependency>
代码示例

使用 Java 进行商品搜索的示例代码如下:

java 复制代码
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;

public class ProductSearchService {
    private RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "http")));

    public SearchResponse searchProducts(String keyword) throws IOException {
        SearchRequest searchRequest = new SearchRequest("products");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.matchQuery("name", keyword));
        searchRequest.source(sourceBuilder);
        return client.search(searchRequest, RequestOptions.DEFAULT);
    }
}

四、总结

通过本文的实战案例,我们展示了如何从零开始使用 Elasticsearch 构建一个商品搜索功能。Elasticsearch 强大的全文搜索能力、灵活的数据建模和快速的查询响应,使其成为开发者处理大规模数据时的首选工具。

在实际项目中,Elasticsearch 还可以用于日志监控、实时分析、推荐系统等多种场景。希望通过这个案例,能帮助你更好地理解 Elasticsearch 的应用,并将其融入到实际项目中。

相关推荐
喝醉酒的小白23 分钟前
Elasticsearch相关知识@1
大数据·elasticsearch·搜索引擎
小小工匠2 小时前
ElasticSearch - 深入解析 Elasticsearch Composite Aggregation 的分页与去重机制
elasticsearch·composite·after_key·桶聚合分页
风_流沙2 小时前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
TGB-Earnest4 小时前
【py脚本+logstash+es实现自动化检测工具】
大数据·elasticsearch·自动化
woshiabc11112 小时前
windows安装Elasticsearch及增删改查操作
大数据·elasticsearch·搜索引擎
arnold6615 小时前
探索 ElasticSearch:性能优化之道
大数据·elasticsearch·性能优化
成长的小牛23317 小时前
es使用knn向量检索中numCandidates和k应该如何配比更合适
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客19 小时前
Elasticsearch:什么是查询语言?
大数据·数据库·elasticsearch·搜索引擎·oracle
启明真纳20 小时前
elasticache备份
运维·elasticsearch·云原生·kubernetes
幽弥千月1 天前
【ELK】ES单节点升级为集群并开启https【亲测可用】
elk·elasticsearch·https