ElasticSearch实战总结从入门到性能优化的那些坑

Prog.蓝月 交互 阅读 2,139
赞 45 收藏
二维码
手机扫码查看
反馈

先看效果,再看代码

最近在项目中用到了ElasticSearch(ES),感觉挺不错的。今天就来聊聊我用ES的一些经验,希望对大家有帮助。

ElasticSearch实战总结从入门到性能优化的那些坑

安装和启动

首先,安装ES其实很简单,直接去官网下载对应的版本,解压后运行bin/elasticsearch就行了。我在本地用的是Docker,直接拉个镜像跑起来:

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.10.1

启动后访问http://localhost:9200,看到如下JSON响应就说明ES已经成功启动了:

{
  "name" : "f456b9c8a7ca",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "wvLqQKJnT8iXzgRrjYVZPA",
  "version" : {
    "number" : "7.10.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "unknown",
    "build_date" : "2020-11-11T00:08:23.217939Z",
    "build_snapshot" : false,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

索引和文档的基本操作

ES的核心就是索引和文档,先来看看怎么创建索引和添加文档。

创建索引

创建一个名为articles的索引,配置一些基本的设置和映射:

PUT /articles
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "content": { "type": "text" },
      "author": { "type": "keyword" },
      "publish_date": { "type": "date" }
    }
  }
}

这里注意下,number_of_shardsnumber_of_replicas的设置会影响性能,建议根据实际需求调整。

添加文档

articles索引里添加几篇文档:

POST /articles/_doc/1
{
  "title": "Elasticsearch入门教程",
  "content": "本文介绍了Elasticsearch的基础知识和使用方法。",
  "author": "张三",
  "publish_date": "2023-10-01"
}

POST /articles/_doc/2
{
  "title": "如何优化Elasticsearch查询",
  "content": "本文介绍了几种优化Elasticsearch查询的方法。",
  "author": "李四",
  "publish_date": "2023-10-02"
}

添加文档的时候,记得指定文档的ID,这样可以方便后续的更新和删除操作。

查询数据

数据加进去了,接下来就是查询了。ES提供了多种查询方式,这里介绍几种常用的。

简单匹配查询

先来个简单的匹配查询,找找标题包含“Elasticsearch”的文章:

GET /articles/_search
{
  "query": {
    "match": {
      "title": "Elasticsearch"
    }
  }
}

这种查询方式适用于简单的全文搜索,但有时候可能不够精准。

布尔查询

如果需要更复杂的查询条件,可以用布尔查询。比如找找标题包含“Elasticsearch”且作者是“张三”的文章:

GET /articles/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "Elasticsearch" } },
        { "term": { "author": "张三" } }
      ]
    }
  }
}

布尔查询可以组合多个条件,must表示所有条件都必须满足,还有shouldmust_not等其他条件。

范围查询

除了文本查询,还可以进行范围查询。比如找找2023年10月发表的文章:

GET /articles/_search
{
  "query": {
    "range": {
      "publish_date": {
        "gte": "2023-10-01",
        "lte": "2023-10-31",
        "format": "yyyy-MM-dd"
      }
    }
  }
}

范围查询对于日期、数字等类型非常有用,可以根据具体需求灵活使用。

踩坑提醒:这三点一定注意

  • 索引名称不能随意更改:索引一旦创建,其名称就不能更改了。如果需要更改名称,只能通过重新索引的方式来实现。
  • 内存配置要合理:ES对内存的需求比较大,如果配置不合理,可能会导致节点挂掉。建议根据实际情况调整jvm.options中的-Xms-Xmx参数。
  • 不要频繁修改映射:映射一旦定义,尽量不要频繁修改。特别是已经有大量数据的情况下,修改映射可能会导致数据丢失或不一致。

高级技巧:聚合查询

聚合查询是ES的一个强大功能,可以用来做统计分析。比如统计每篇文章的阅读量:

GET /articles/_search
{
  "size": 0,
  "aggs": {
    "authors": {
      "terms": {
        "field": "author"
      },
      "aggs": {
        "total_views": {
          "sum": {
            "field": "views"
          }
        }
      }
    }
  }
}

这个查询会返回每个作者的文章总阅读量。size: 0表示不返回具体的文档,只返回聚合结果。

总结

以上是我个人对ElasticSearch的一些经验和分享,希望对你们有帮助。ES的功能还有很多,比如分词、高亮、多租户等,后续我会继续分享这些内容。如果你有更好的实现方式或者遇到问题,欢迎在评论区交流。

本文章不代表JZTHEME立场,仅为作者个人观点 / 研究心得 / 经验分享,旨在交流探讨,供读者参考。
发表评论
设计师文君
作者的专业度很高,写出来的东西就是不一样。
点赞 1
2026-02-05 17:25