ElasticSearch实战总结从入门到性能优化的那些坑
先看效果,再看代码
最近在项目中用到了ElasticSearch(ES),感觉挺不错的。今天就来聊聊我用ES的一些经验,希望对大家有帮助。
安装和启动
首先,安装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_shards和number_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表示所有条件都必须满足,还有should、must_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的功能还有很多,比如分词、高亮、多租户等,后续我会继续分享这些内容。如果你有更好的实现方式或者遇到问题,欢迎在评论区交流。
