ES搜索:从基础概念到高级应用
一、ES简介
1.1 什么是ElasticSearch?
ElasticSearch(简称ES)是一个开源的高扩展分布式全文检索引擎,它基于Apache Lucene构建,隐藏了Lucene的复杂性,提供了简单易用的RESTful API接口。 ES 几乎可以实时存储和检索数据,支持扩展到上百台服务器,处理PB级别的数据,它被广泛应用于全文检索、日志和事件数据分析、安全情报和信息聚合等领域。
1.2 为什么选择ElasticSearch?
ES 提供了一系列强大的功能使其在众多搜索引擎中脱颖而出:
近实时搜索:从数据写入到可检索的延迟通常在一秒以内。
分布式和扩展性强:支持横向扩展,通过增加节点提升性能和容量。
高可用性和容错性:通过分片和复制机制实现高可用性和数据容错。
易用性和灵活性:提供简单的RESTful API,易于集成和使用。
强大的分析功能:内置多种分析和聚合工具,支持复杂的数据处理需求。
二、安装与配置
2.1 下载与安装
前往[官方地址](https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html#install-elasticsearch)下载最新版本的ES。
根据操作系统不同,下载对应的安装包并进行解压。
2.2 修改配置文件
在config/elasticsearch.yml
文件中进行基本配置:
cluster.name: my-cluster node.name: node-1 network.host: 192.168.1.1 http.port: 9200 discovery.type: single-node
2.3 启动ElasticSearch
在命令行中执行以下命令启动ES:
bin/elasticsearch
访问 http://localhost:9200 验证安装是否成功,若返回如下信息则说明安装成功:
{ "name" : "node-1", "cluster_name" : "my-cluster", "cluster_uuid" : "some_uuid", "version" : { "number" : "7.9.2", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "some_hash", "build_date" : "2020-07-29T16:34:40.587843Z", "build_snapshot" : false, "lucene_version" : "8.6.2", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
三、ES的核心概念
3.1 索引(Index)
索引是ES中的数据存储的基本单元,类似于关系型数据库中的数据库,每个索引都是一个命名空间,包含一组文档,可以为客户信息创建一个索引,为产品信息创建另一个索引。
3.2 类型(Type)
类型用于对索引中的文档进行分类,属于旧版本ES的概念,新版ES(自5.x起)不再推荐使用类型,并在7.x中移除了该概念。
3.3 文档(Document)
文档是ES中最小的数据单元,相当于关系型数据库中的一行记录,文档采用JSON格式存储,包含多个字段和值。
{ "user": "john_doe", "age": 30, "email": "john@example.com" }
3.4 字段(Field)
字段是文档中的具体属性,每个字段都有自己的名称和值,字段可以是简单数据类型(如字符串、数字、布尔值等),也可以是复杂数据类型(如对象或数组)。
四、数据操作
4.1 创建索引
在ES中创建索引非常简单,只需发送HTTP请求即可:
PUT /customers { "settings": { "number_of_shards": 3, "number_of_replicas": 2 } }
上述命令创建了一个名为customers
的索引,并设置了分片和复制的数量。
4.2 添加文档
向索引中添加文档可以使用以下命令:
POST /customers/_doc/1 { "name": "John Doe", "email": "john@example.com", "age": 30 }
这会在customers
索引中添加一个ID为1的文档。
4.3 更新文档
更新文档的部分字段:
POST /customers/_update/1 { "doc": { "email": "john.new@example.com" } }
4.4 删除文档
根据ID删除文档:
DELETE /customers/_doc/1
4.5 查询文档
根据ID查询文档:
GET /customers/_doc/1
条件查询:
GET /customers/_search { "query": { "match": { "name": "John Doe" } } }
五、ES中的查询DSL简介
5.1 match查询
match
查询用于全文搜索,适用于对单个字段进行模糊匹配:
{ "query": { "match": { "description": " once in a lifetime experience" } } }
5.2 term查询
term
查询用于精确匹配字段的具体内容,不支持分词:
{ "query": { "term": { "status": "open" } } }
5.3 bool查询
bool
查询允许组合多个查询条件,使用must
、should
、must_not
等子句:
{ "query": { "bool": { "must": [ { "match": { "title": "first" }}, { "match": { "description": "data" }}, { "match": { "content": "elasticsearch" }} ], "must_not": { "term": { "status": "draft" } }, "should": [ { "term": { "tags": "tech" }}, { "range": { "publish_date": { "gte": "2015-01-01" }}} ] } } }
5.4 range查询
range
查询用于范围检索,常用于日期、数字等类型字段:
{ "query": { "range": { "age": { "gte": 30, "lte": 40, "include_lower": true, "include_upper": false } } } }
5.5 wildcard查询
wildcard
查询用于通配符匹配:
{ "query": { "wildcard": { "name": "Jo*n D*e" } } }
六、集群与扩展
ES的设计目标之一就是支持大规模数据量和高并发访问,通过将多个ES实例组织成一个集群,可以实现数据的分布式存储和检索,提高系统的可用性和性能,集群中的每个节点可以担任主节点(Master)或数据节点(Data),还可以配置协调节点(Coordinating Node)来优化搜索性能,利用分片和复制机制,ES能够自动管理数据的分布和备份,确保即使部分节点失效,系统也能正常运行,这些特性使得ES非常适合构建大规模、高可用性的搜索应用。
七、常见问题及调优技巧
尽管ES具有许多优点,但在实际应用中也可能遇到各种问题,集群状态变为黄色或红色可能是由于分片分配不均或节点故障导致的,调优技巧包括调整分片数和复制因子以平衡性能与可靠性,使用合适的硬件资源配置,以及定期进行索引维护和优化,对于复杂的查询场景,合理设计和使用查询DSL也至关重要,避免深度分页和大规模聚合操作,以减少系统负担,通过监控ES的运行状态和日志,可以及时发现并解决潜在问题,确保系统稳定高效地运行。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1393588.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复