Node.js中使用Elasticsearch

发布于:2025-03-19 ⋅ 阅读:(15) ⋅ 点赞:(0)

目录

一、环境准备

1.1 启动Elasticsearch服务

1.2 安装Node.js客户端

二、客户端初始化

2.1 基础连接

三、核心操作指南

3.1 文档CRUD操作

创建文档(自动生成ID)

精确检索文档

四、搜索与聚合实战

4.1 复合条件查询

4.2 分页与排序

五、高级特性应用

5.1 数据聚合分析

六、性能优化实践

6.1 批量操作

6.2 客户端配置建议

七、错误处理策略

7.1 结构化异常处理

八、完整示例应用

九、学习资源推荐


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

官网

一、环境准备

1.1 启动Elasticsearch服务

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

1.2 安装Node.js客户端

npm install @elastic/elasticsearch

二、客户端初始化

2.1 基础连接

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)
async function createProduct() {
  const { _id } = await client.index({
    index: 'products',
    body: {
      name: 'Wireless Headphones',
      price: 199.99,
      category: 'electronics'
    }
  });
  return _id;
}
精确检索文档
async function getProduct(id) {
  const { _source } = await client.get({
    index: 'products',
    id: id
  });
  return _source;
}

四、搜索与聚合实战

4.1 复合条件查询

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 分页与排序

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 数据聚合分析

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 批量操作

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

6.2 客户端配置建议

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

七、错误处理策略

7.1 结构化异常处理

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');
  }
}

八、完整示例应用

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