Node.js中使用Elasticsearch

目录

一、环境准备

[1.1 启动Elasticsearch服务](#1.1 启动Elasticsearch服务)

[1.2 安装Node.js客户端](#1.2 安装Node.js客户端)

二、客户端初始化

[2.1 基础连接](#2.1 基础连接)

三、核心操作指南

[3.1 文档CRUD操作](#3.1 文档CRUD操作)

创建文档(自动生成ID)

精确检索文档

四、搜索与聚合实战

[4.1 复合条件查询](#4.1 复合条件查询)

[4.2 分页与排序](#4.2 分页与排序)

五、高级特性应用

[5.1 数据聚合分析](#5.1 数据聚合分析)

六、性能优化实践

[6.1 批量操作](#6.1 批量操作)

[6.2 客户端配置建议](#6.2 客户端配置建议)

七、错误处理策略

[7.1 结构化异常处理](#7.1 结构化异常处理)

八、完整示例应用

九、学习资源推荐


Elasticsearch作为领先的分布式搜索分析引擎,与Node.js的结合能为应用提供强大的实时搜索和数据分析能力。本文将带你完成从环境搭建到高级查询的全流程实践。

官网

一、环境准备

1.1 启动Elasticsearch服务

bash 复制代码
# 使用Docker快速启动(单节点模式)
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:8.13.0

1.2 安装Node.js客户端

bash 复制代码
npm install @elastic/elasticsearch

二、客户端初始化

2.1 基础连接

javascript 复制代码
const { Client } = require('@elastic/elasticsearch');
// 连接本地实例
const client = new Client({ node: 'http://localhost:9200' });
// 连接云服务(示例:Elastic Cloud)
const cloudClient = new Client({
  cloud: { id: '' },
  auth: { apiKey: '' }
});

三、核心操作指南

3.1 文档CRUD操作

创建文档(自动生成ID)
javascript 复制代码
async function createProduct() {
  const { _id } = await client.index({
    index: 'products',
    body: {
      name: 'Wireless Headphones',
      price: 199.99,
      category: 'electronics'
    }
  });
  return _id;
}
精确检索文档
javascript 复制代码
async function getProduct(id) {
  const { _source } = await client.get({
    index: 'products',
    id: id
  });
  return _source;
}

四、搜索与聚合实战

4.1 复合条件查询

javascript 复制代码
async function searchHighEndElectronics() {
  const { hits } = await client.search({
    index: 'products',
    body: {
      query: {
        bool: {
          must: [{ match: { category: 'electronics' }}],
          filter: [{ range: { price: { gte: 500 } }}]
        }
      }
    }
  });
  return hits.hits.map(hit => hit._source);
}

4.2 分页与排序

javascript 复制代码
async function getPaginatedResults(page = 1, pageSize = 10) {
  const from = (page - 1) * pageSize;
  
  const result = await client.search({
    index: 'products',
    from,
    size: pageSize,
    sort: [{ price: { order: 'desc' } }]
  });
  return {
    data: result.hits.hits,
    total: result.hits.total.value
  };
}

五、高级特性应用

5.1 数据聚合分析

javascript 复制代码
async function analyzePrices() {
  const { aggregations } = await client.search({
    index: 'products',
    body: {
      aggs: {
        price_stats: {
          stats: { field: 'price' }
        },
        category_distribution: {
          terms: { field: 'category.keyword' }
        }
      }
    }
  });
  return {
    averagePrice: aggregations.price_stats.avg,
    categoryDistribution: aggregations.category_distribution.buckets
  };
}

六、性能优化实践

6.1 批量操作

javascript 复制代码
async function bulkImport(products) {
  const body = products.flatMap(product => [
    { index: { _index: 'products' } },
    product
  ]);
  await client.bulk({ body });
}

6.2 客户端配置建议

javascript 复制代码
// 优化客户端配置示例
const optimizedClient = new Client({
  node: 'http://localhost:9200',
  maxRetries: 3,
  requestTimeout: 60000,
  log: 'warning' // 生产环境推荐日志级别
});

七、错误处理策略

7.1 结构化异常处理

javascript 复制代码
async function safeSearch(query) {
  try {
    return await client.search(query);
  } catch (error) {
    console.error(`[ES Error] ${error.meta.statusCode}:`, error.meta.body.error.reason);
    throw new Error('Search operation failed');
  }
}

八、完整示例应用

javascript 复制代码
const { Client } = require('@elastic/elasticsearch');
const client = new Client({ node: 'http://localhost:9200' });
async function productManager() {
  // 批量创建
  await bulkImport([
    { name: 'Smartphone', price: 799.99, category: 'electronics' },
    { name: 'Coffee Maker', price: 129.99, category: 'kitchen' }
  ]);
  // 复杂查询
  const results = await searchHighEndElectronics();
  console.log('Premium electronics:', results);
  // 聚合分析
  const analysis = await analyzePrices();
  console.log('Average price:', analysis.averagePrice);
}
productManager().catch(console.error);

九、学习资源推荐

Elasticsearch官方文档

Node.js客户端GitHub仓库

•Elastic Stack生态技术栈(Kibana、Logstash)


通过本文的实践指南,您已掌握在Node.js中操作Elasticsearch的核心技能。建议结合实际业务需求,深入探索Elasticsearch的更多高级特性,如全文搜索优化、索引生命周期管理等,以构建更强大的搜索分析系统。

相关推荐
£菜鸟也有梦12 分钟前
从0到1,带你走进Flink的世界
大数据·hadoop·flink·spark
Data-Miner1 小时前
可编辑PPT | 基于大数据中台新能源智能汽车应用解决方案汽车大数据分析与应用解决方案
大数据·汽车
鱼儿也有烦恼1 小时前
Elasticsearch最新入门教程
java·elasticsearch·kibana
花晓木1 小时前
Filebeat收集nginx日志到elasticsearch,最终在kibana做展示(二)
elasticsearch·搜索引擎
路修1 小时前
Spring Boot + Elasticsearch + HBase 构建海量数据搜索系统
spring boot·elasticsearch·hbase
武子康2 小时前
Java-39 深入浅出 Spring - AOP切面增强 核心概念 通知类型 XML+注解方式 附代码
xml·java·大数据·开发语言·后端·spring
G皮T2 小时前
【Elasticsearch】Elasticsearch 核心技术(二):映射
大数据·elasticsearch·映射·搜索·动态映射·mappings
隰有游龙8 小时前
hadoop集群启动没有datanode解决
大数据·hadoop·分布式
人工智能小豪10 小时前
2025年大模型平台落地实践研究报告|附75页PDF文件下载
大数据·人工智能·transformer·anythingllm·ollama·大模型应用
我的golang之路果然有问题11 小时前
ElasticSearch+Gin+Gorm简单示例
大数据·开发语言·后端·elasticsearch·搜索引擎·golang·gin