Elasticsearch使用示例
1. 基本操作示例
1.1 创建索引
curl -X PUT "localhost:9200/my_index" -H "Content-Type: application/json" -d'
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"title": { "type": "text", "analyzer": "ik_max_word" },
"content": { "type": "text", "analyzer": "ik_max_word" },
"author": { "type": "keyword" },
"publish_date": { "type": "date" },
"views": { "type": "long" }
}
}
}'
1.2 添加文档
curl -X POST "localhost:9200/my_index/_doc" -H "Content-Type: application/json" -d'
{
"title": "Elasticsearch入门指南",
"content": "Elasticsearch是一个开源的分布式搜索和分析引擎...",
"author": "张三",
"publish_date": "2024-04-03",
"views": 100
}'
curl -X POST "localhost:9200/my_index/_bulk" -H "Content-Type: application/json" -d'
{"index":{}}
{"title":"ES高级查询","content":"Elasticsearch提供了丰富的查询功能...","author":"李四","publish_date":"2024-04-02","views":50}
{"index":{}}
{"title":"ES性能优化","content":"如何优化Elasticsearch的性能...","author":"王五","publish_date":"2024-04-01","views":200}
'
1.3 查询文档
curl -X GET "localhost:9200/my_index/_search" -H "Content-Type: application/json" -d'
{
"query": {
"match": {
"title": "Elasticsearch"
}
}
}'
curl -X GET "localhost:9200/my_index/_search" -H "Content-Type: application/json" -d'
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" }},
{ "range": { "views": { "gte": 100 }}}
],
"filter": [
{ "term": { "author": "张三" }}
]
}
},
"sort": [
{ "views": "desc" }
],
"from": 0,
"size": 10
}'
1.4 更新文档
curl -X POST "localhost:9200/my_index/_update/1" -H "Content-Type: application/json" -d'
{
"doc": {
"views": 150
}
}'
1.5 删除文档
curl -X DELETE "localhost:9200/my_index/_doc/1"
curl -X DELETE "localhost:9200/my_index"
2. 高级查询示例
2.1 全文搜索
curl -X GET "localhost:9200/my_index/_search" -H "Content-Type: application/json" -d'
{
"query": {
"match": {
"content": {
"query": "分布式搜索",
"analyzer": "ik_max_word"
}
}
}
}'
2.2 聚合查询
curl -X GET "localhost:9200/my_index/_search" -H "Content-Type: application/json" -d'
{
"aggs": {
"group_by_author": {
"terms": {
"field": "author"
},
"aggs": {
"total_views": {
"sum": {
"field": "views"
}
}
}
}
}
}'
2.3 高亮显示
curl -X GET "localhost:9200/my_index/_search" -H "Content-Type: application/json" -d'
{
"query": {
"match": {
"content": "Elasticsearch"
}
},
"highlight": {
"fields": {
"content": {}
}
}
}'
3. 实际应用场景示例
3.1 电商商品搜索
curl -X PUT "localhost:9200/products" -H "Content-Type: application/json" -d'
{
"mappings": {
"properties": {
"name": { "type": "text", "analyzer": "ik_max_word" },
"description": { "type": "text", "analyzer": "ik_max_word" },
"price": { "type": "double" },
"category": { "type": "keyword" },
"brand": { "type": "keyword" },
"stock": { "type": "integer" },
"sales": { "type": "long" },
"create_time": { "type": "date" }
}
}
}'
curl -X GET "localhost:9200/products/_search" -H "Content-Type: application/json" -d'
{
"query": {
"bool": {
"must": [
{ "match": { "name": "手机" }},
{ "range": { "price": { "gte": 1000, "lte": 5000 }}}
],
"filter": [
{ "term": { "category": "电子产品" }}
]
}
},
"sort": [
{ "sales": "desc" }
]
}'
3.2 日志分析
curl -X PUT "localhost:9200/logs" -H "Content-Type: application/json" -d'
{
"mappings": {
"properties": {
"timestamp": { "type": "date" },
"level": { "type": "keyword" },
"message": { "type": "text" },
"service": { "type": "keyword" },
"host": { "type": "keyword" }
}
}
}'
curl -X GET "localhost:9200/logs/_search" -H "Content-Type: application/json" -d'
{
"query": {
"bool": {
"must": [
{ "match": { "level": "ERROR" }},
{ "range": { "timestamp": { "gte": "now-1d" }}}
]
}
},
"aggs": {
"group_by_service": {
"terms": {
"field": "service"
},
"aggs": {
"error_count": {
"value_count": {
"field": "level"
}
}
}
}
}
}'
3.3 用户行为分析
curl -X PUT "localhost:9200/user_actions" -H "Content-Type: application/json" -d'
{
"mappings": {
"properties": {
"user_id": { "type": "keyword" },
"action": { "type": "keyword" },
"page": { "type": "keyword" },
"timestamp": { "type": "date" },
"duration": { "type": "long" }
}
}
}'
curl -X GET "localhost:9200/user_actions/_search" -H "Content-Type: application/json" -d'
{
"query": {
"range": {
"timestamp": {
"gte": "now-7d"
}
}
},
"aggs": {
"popular_pages": {
"terms": {
"field": "page",
"size": 10
},
"aggs": {
"avg_duration": {
"avg": {
"field": "duration"
}
}
}
}
}
}'
4. 性能优化示例
4.1 索引优化
curl -X PUT "localhost:9200/my_index/_settings" -H "Content-Type: application/json" -d'
{
"index": {
"refresh_interval": "30s",
"number_of_replicas": 1,
"max_result_window": 10000
}
}'
4.2 查询优化
curl -X GET "localhost:9200/my_index/_search" -H "Content-Type: application/json" -d'
{
"query": {
"bool": {
"filter": [
{ "term": { "status": "active" }},
{ "range": { "create_time": { "gte": "now-1d" }}}
]
}
}
}'
5. 监控和维护示例
5.1 集群健康检查
curl -X GET "localhost:9200/_cluster/health?pretty"
curl -X GET "localhost:9200/_cat/nodes?v"
curl -X GET "localhost:9200/_cat/indices?v"
5.2 备份和恢复
curl -X PUT "localhost:9200/_snapshot/my_backup" -H "Content-Type: application/json" -d'
{
"type": "fs",
"settings": {
"location": "/path/to/backup"
}
}'
curl -X PUT "localhost:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true"
curl -X POST "localhost:9200/_snapshot/my_backup/snapshot_1/_restore?wait_for_completion=true"
6. 高级功能示例
6.1 地理位置搜索
curl -X PUT "localhost:9200/restaurants" -H "Content-Type: application/json" -d'
{
"mappings": {
"properties": {
"name": { "type": "text" },
"location": { "type": "geo_point" },
"cuisine": { "type": "keyword" },
"rating": { "type": "float" }
}
}
}'
curl -X POST "localhost:9200/restaurants/_bulk" -H "Content-Type: application/json" -d'
{"index":{}}
{"name":"北京烤鸭店","location":{"lat":39.9042,"lon":116.4074},"cuisine":"中餐","rating":4.5}
{"index":{}}
{"name":"上海小笼包","location":{"lat":31.2304,"lon":121.4737},"cuisine":"中餐","rating":4.2}
'
curl -X GET "localhost:9200/restaurants/_search" -H "Content-Type: application/json" -d'
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "10km",
"location": {
"lat": 39.9042,
"lon": 116.4074
}
}
}
}
},
"sort": [
{
"_geo_distance": {
"location": {
"lat": 39.9042,
"lon": 116.4074
},
"order": "asc",
"unit": "km"
}
}
]
}'
6.2 嵌套文档
curl -X PUT "localhost:9200/blogs" -H "Content-Type: application/json" -d'
{
"mappings": {
"properties": {
"title": { "type": "text" },
"author": { "type": "keyword" },
"comments": {
"type": "nested",
"properties": {
"user": { "type": "keyword" },
"content": { "type": "text" },
"date": { "type": "date" }
}
}
}
}
}'
curl -X POST "localhost:9200/blogs/_doc" -H "Content-Type: application/json" -d'
{
"title": "Elasticsearch入门",
"author": "张三",
"comments": [
{
"user": "李四",
"content": "很好的教程",
"date": "2024-04-01"
},
{
"user": "王五",
"content": "期待更多内容",
"date": "2024-04-02"
}
]
}'
curl -X GET "localhost:9200/blogs/_search" -H "Content-Type: application/json" -d'
{
"query": {
"nested": {
"path": "comments",
"query": {
"bool": {
"must": [
{ "match": { "comments.user": "李四" }},
{ "match": { "comments.content": "教程" }}
]
}
}
}
}
}'
6.3 脚本查询
curl -X GET "localhost:9200/products/_search" -H "Content-Type: application/json" -d'
{
"query": {
"function_score": {
"query": {
"match": { "name": "手机" }
},
"functions": [
{
"script_score": {
"script": {
"source": "doc[\"price\"].value < 2000 ? 2 : 1"
}
}
}
]
}
}
}'
curl -X GET "localhost:9200/products/_search" -H "Content-Type: application/json" -d'
{
"script_fields": {
"discount_price": {
"script": {
"source": "doc[\"price\"].value * 0.8"
}
}
}
}'
7. 实际业务场景示例
7.1 新闻推荐系统
curl -X PUT "localhost:9200/news" -H "Content-Type: application/json" -d'
{
"mappings": {
"properties": {
"title": { "type": "text", "analyzer": "ik_max_word" },
"content": { "type": "text", "analyzer": "ik_max_word" },
"category": { "type": "keyword" },
"tags": { "type": "keyword" },
"publish_time": { "type": "date" },
"views": { "type": "long" },
"likes": { "type": "long" },
"user_interests": { "type": "keyword" }
}
}
}'
curl -X GET "localhost:9200/news/_search" -H "Content-Type: application/json" -d'
{
"query": {
"function_score": {
"query": {
"bool": {
"should": [
{ "match": { "category": "科技" }},
{ "terms": { "tags": ["人工智能", "大数据"] }}
]
}
},
"functions": [
{
"field_value_factor": {
"field": "views",
"factor": 0.1,
"modifier": "log1p"
}
},
{
"field_value_factor": {
"field": "likes",
"factor": 0.2,
"modifier": "log1p"
}
}
],
"boost_mode": "sum"
}
},
"sort": [
{ "_score": "desc" },
{ "publish_time": "desc" }
]
}'
7.2 电商商品搜索优化
curl -X GET "localhost:9200/products/_search" -H "Content-Type: application/json" -d'
{
"query": {
"multi_match": {
"query": "智能手机",
"fields": [
"name^3",
"description^2",
"brand",
"category"
],
"type": "best_fields",
"tie_breaker": 0.3
}
},
"rescore": {
"window_size": 10,
"query": {
"rescore_query": {
"function_score": {
"query": { "match_all": {} },
"functions": [
{
"field_value_factor": {
"field": "sales",
"factor": 0.1,
"modifier": "log1p"
}
},
{
"field_value_factor": {
"field": "rating",
"factor": 0.2
}
}
],
"boost_mode": "sum"
}
}
}
},
"aggs": {
"price_ranges": {
"range": {
"field": "price",
"ranges": [
{ "to": 1000 },
{ "from": 1000, "to": 3000 },
{ "from": 3000 }
]
}
},
"brands": {
"terms": {
"field": "brand",
"size": 10
}
}
}
}'
7.3 日志监控系统
curl -X GET "localhost:9200/logs-*/_search" -H "Content-Type: application/json" -d'
{
"query": {
"bool": {
"must": [
{ "match": { "level": "ERROR" }},
{ "range": { "@timestamp": { "gte": "now-1h" }}}
]
}
},
"aggs": {
"error_trend": {
"date_histogram": {
"field": "@timestamp",
"calendar_interval": "5m"
},
"aggs": {
"error_count": {
"value_count": {
"field": "level"
}
}
}
},
"top_errors": {
"terms": {
"field": "message.keyword",
"size": 10
}
},
"services": {
"terms": {
"field": "service.keyword",
"size": 5
},
"aggs": {
"error_rate": {
"avg": {
"script": {
"source": "doc[\"level\"].value == \"ERROR\" ? 1 : 0"
}
}
}
}
}
}
}'
8. 性能优化示例
8.1 索引优化
curl -X PUT "localhost:9200/my_index/_settings" -H "Content-Type: application/json" -d'
{
"index": {
"refresh_interval": "30s",
"number_of_replicas": 1,
"max_result_window": 10000,
"blocks": {
"read_only_allow_delete": false
},
"merge": {
"scheduler": {
"max_thread_count": 1
}
}
}
}'
curl -X PUT "localhost:9200/my_index/_settings" -H "Content-Type: application/json" -d'
{
"index.routing.allocation.total_shards_per_node": 3,
"index.unassigned.node_left.delayed_timeout": "5m"
}'
8.2 查询优化
curl -X GET "localhost:9200/my_index/_search" -H "Content-Type: application/json" -d'
{
"query": {
"bool": {
"filter": [
{ "term": { "status": "active" }},
{ "range": { "create_time": { "gte": "now-1d" }}}
],
"must": [
{ "match": { "title": "重要" }}
]
}
},
"track_total_hits": true,
"explain": true
}'
curl -X GET "localhost:9200/products/_search" -H "Content-Type: application/json" -d'
{
"collapse": {
"field": "brand.keyword",
"inner_hits": {
"name": "top_products",
"size": 3,
"sort": ["price"]
}
},
"sort": ["_score"]
}'
9. 监控和维护示例
9.1 集群监控
curl -X GET "localhost:9200/_cluster/health?pretty"
curl -X GET "localhost:9200/_nodes/stats?pretty"
curl -X GET "localhost:9200/_cat/indices?v&h=index,health,status,pri,rep,docs.count,store.size"
curl -X GET "localhost:9200/_cat/shards?v&h=index,shard,prirep,state,docs,store,node"
9.2 性能监控
curl -X GET "localhost:9200/_nodes/hot_threads"
curl -X GET "localhost:9200/_nodes/stats/indices?pretty"
curl -X GET "localhost:9200/_nodes/stats/jvm?pretty"
9.3 数据维护
curl -X DELETE "localhost:9200/logs-2024-03-*"
curl -X POST "localhost:9200/my_index/_forcemerge?max_num_segments=1"
curl -X PUT "localhost:9200/my_index/_settings" -H "Content-Type: application/json" -d'
{
"index": {
"refresh_interval": "1s",
"number_of_replicas": 2
}
}'