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 的应用,并将其融入到实际项目中。

相关推荐
Mephisto.java2 小时前
【大数据学习 | Spark】Spark的改变分区的算子
大数据·elasticsearch·oracle·spark·kafka·memcache
mqiqe2 小时前
Elasticsearch 分词器
python·elasticsearch
小马爱打代码2 小时前
Elasticsearch简介与实操
大数据·elasticsearch·搜索引擎
java1234_小锋11 小时前
Elasticsearch是如何实现Master选举的?
大数据·elasticsearch·搜索引擎
梦幻通灵17 小时前
ES分词环境实战
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客17 小时前
Elasticsearch 中的热点以及如何使用 AutoOps 解决它们
大数据·运维·elasticsearch·搜索引擎·全文检索
小黑屋说YYDS1 天前
ElasticSearch7.x入门教程之索引概念和基础操作(三)
elasticsearch
Java 第一深情1 天前
Linux上安装单机版ElasticSearch6.8.1
linux·elasticsearch·全文检索
KevinAha2 天前
Elasticsearch 6.8 分析器
elasticsearch
wuxingge2 天前
elasticsearch7.10.2集群部署带认证
运维·elasticsearch