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的更多高级特性,如全文搜索优化、索引生命周期管理等,以构建更强大的搜索分析系统。

相关推荐
szxinmai主板定制专家42 分钟前
基于FPGA的3U机箱轨道交通网络通讯板,对内和主控板、各类IO板通信,对外可进行RS485、CAN或MVB组网通信
大数据·人工智能·嵌入式硬件·fpga开发·边缘计算
图生生2 小时前
图生生AI修图,用“画面扩充“重构创作想象
大数据·人工智能·ai·ai作画·图生生·ai修图·画面重构
GIS数据转换器2 小时前
北斗+多技术融合地面沉降监测:精准守护城市安全
大数据·人工智能·物联网·无人机·智慧城市
集成显卡3 小时前
IT工具 | node.js 进程管理工具 PM2 大升级!支持 Bun.js
javascript·node.js
小鱼冻干3 小时前
express中间件
前端·mysql·node.js
Dragon--Z4 小时前
大数据技术链路详解
大数据
刘东_长乐未央4 小时前
Node.js 项目实践 - 编辑器与创建 Express 项目
node.js
刘东_长乐未央4 小时前
Node.js 项目实践 - 使用 nvm 安装 Node.js
node.js
还是鼠鼠4 小时前
Node.js--CommonJS 模块化规范详解:使用方法、缓存机制与模块解析
前端·javascript·vscode·缓存·node.js·web
霖005 小时前
FPGA中级项目4——DDS实现
大数据·经验分享·嵌入式硬件·学习·fpga开发·fpga