Elasticsearch入门指南:从安装到实战

📅 发布时间:2026/7/7 11:45:02 👁️ 浏览次数:
Elasticsearch入门指南:从安装到实战
1.ES介绍1. 是什么?Elasticsearch(ES)是一个开源的、分布式的搜索与分析引擎。基于Apache Lucene构建,但提供了分布式、RESTful API、高可用等企业级能力。使用Java 编写,天然支持跨平台。✅ 核心定位:快速存储、搜索和分析大量数据。Elasticsearch = 分布式 + 近实时 + 全文搜索 + 聚合分析 + JSON 文档存储2. 核心特性特性说明🔍全文检索支持复杂文本查询、相关性打分、高亮显示⚡近实时(NRT)文档写入后默认1 秒内可被搜索🌐分布式 水平扩展数据自动分片(shard),可部署在成百上千节点🛡️高可用副本机制(replica)保障数据不丢失、服务不中断📦JSON 文档存储无 schema 限制(但推荐定义 mapping)📊聚合分析支持统计、分组、直方图、地理空间分析等🌍RESTful API所有操作通过 HTTP + JSON 完成,易于集成3. 典型应用场景ES 把数据切成多份(分片),分散存到不同机器上,并为文本建立“倒排索引”,让你能快速全文搜索和实时分析。🔎站内搜索:电商商品、文章、用户内容搜索📝日志分析:系统日志、应用日志集中收集与排查(ELK Stack)📈指标监控:服务器性能、业务指标实时可视化🛡️安全信息与事件管理(SIEM):异常登录、攻击行为分析💡推荐/相似匹配:基于内容或行为的“猜你喜欢”2.ES安装1.下载安装官方网址:https://www.elastic.co/cn/products/elasticsearchbin:脚本目录,包括:启动、停止等可执行脚本 config:配置文件目录 data:索引目录,存放索引文件的地方 logs:日志目录 modules:模块目录,包括了es的功能模块 plugins :插件目录,es支持插件机制安装成功后直接在bin目录下,双击打开elasticsearch.bat然后在浏览器访问9201端口,能获取到相关信息的json数据2.配置文件三个配置文件elasticsearch.yml : 用于配置Elasticsearch运行参数jvm.options : 用于配置Elasticsearch JVM设置log4j2.properties: 用于配置Elasticsearch日志配置文件作用修改后是否需重启elasticsearch.yml集群、网络、存储等核心参数✅ 需要jvm.optionsJVM 内存、GC、性能调优✅ 需要log4j2.properties日志级别、格式、输出方式❌不需要(ES 支持热加载日志配置)生产部署前务必根据机器资源调整jvm.options和elasticsearch.yml;不要盲目复制网上的配置,需结合实际场景(数据量、QPS、硬件)优化。1.主配置文件控制集群、节点、网络、数据存储等核心行为。# 集群名称(同一集群所有节点必须一致) cluster.name: xinSearch ​ # 节点名称(唯一标识) node.name: xin_node_1 ​ # 监听地址:0.0.0.0 允许外部访问(开发用,生产建议内网 IP) network.host: 0.0.0.0 ​ # HTTP 端口(REST API,默认 9200) http.port: 9200 ​ # 节点间通信端口(默认 9300) transport.tcp.port: 9300 ​ # 是否可成为主节点 node.master: true ​ # 是否存储数据 node.data: true ​ # 最小主节点数(单节点设为 1,防脑裂) discovery.zen.minimum_master_nodes: 1 ​ # 是否锁定内存(Windows 建议 false) bootstrap.memory_lock: false ​ # 同一机器最多运行的数据节点数(开发多实例时调整) node.max_local_storage_nodes: 1 ​ # 数据存储路径 path.data: F:\ES\elasticsearch-6.2.1\data ​ # 日志存储路径 path.logs: F:\ES\elasticsearch-6.2.1\logs ​ # 启用跨域(前端直连 ES 开发时需要) http.cors.enabled: true ​ # 允许任意域名跨域(⚠️ 仅限开发!生产应限制具体域名) http.cors.allow-origin: /.*/⚠️ 注意:修改后需重启 ES 生效。生产环境不要设置network.host: 0.0.0.0除非有安全防护(如防火墙)。2. JVM 内存与 GC 配置控制 Elasticsearch 运行的 Java 虚拟机参数,直接影响性能和稳定性。# 堆内存大小(建议:不超过物理内存 50%,且 ≤ 32GB) -Xms4g -Xmx4g ​ # 推荐使用 G1GC(ES 7+ 默认) -XX:+UseG1GC -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 ​ # 禁用显式 GC(防止 System.gc() 被调用) -XX:+DisableExplicitGC ​ # 打印 GC 日志(用于性能分析,生产可选) -Xlog:gc*,gc+age=trace,safepoint:file=/var/log/elasticsearch/gc.log:utctime,pid,tags:filecount=32,filesize=64m🔑 关键原则:-Xms和-Xmx必须相等,避免运行时动态扩容导致卡顿。堆内存 ≤ 32GB:超过则指针压缩失效,内存浪费严重。不要超过物理内存 50%:剩余内存留给 Lucene 使用(Lucene 用堆外内存缓存索引)。3.日志配置文件控制 Elasticsearch 日志级别、输出格式、滚动策略等。# 根日志级别(默认 INFO) rootLogger.level = info rootLogger.appenderRef.console.ref = console rootLogger.appenderRef.rolling.ref = rolling ​ # 控制台输出(开发时有用,生产通常关闭) appender.console.type = Console appender.console.name = console appender.console.layout.type = PatternLayout appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%m%n ​ # 文件滚动日志(按大小 + 时间) appender.rolling.type = RollingFile appender.rolling.name = rolling appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.log.gz appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%m%n appender.rolling.policies.type = Policies appender.rolling.policies.time.type = TimeBasedTriggeringPolicy appender.rolling.policies.time.interval = 1 appender.rolling.policies.time.modulate = true appender.rolling.policies.size.type = SizeBasedTriggeringPolicy appender.rolling.policies.size.size = 256MB appender.rolling.strategy.type = DefaultRolloverStrategy appender.rolling.strategy.max = 32 ​ # 特定包的日志级别(调试用) logger.action.name = org.elasticsearch.action logger.action.level = debug💡 常见调整:将rootLogger.level = warn减少日志量;临时开启某个模块 debug:logger.index.search.level = debug;日志默认保存在path.logs目录下,自动压缩归档。window中cmd命令netstat -ano | findstr :端口号 查询端口taskkill /pid 86284 /f 强制结束pid862843.head插件安装head 插件是 ES 的一个可视化管理插件,用来监视 ES 的状态,并通过 head 客户端和 ES 服务进行交互,比如创建映射、创建索引等,head的项目地址在https://github.com/mobz/elasticsearch-head 。从ES6.0开始,head插件支持得使用node.js运行。# 安装node.js # 下载head并运行 ​ git clone git://github.com/mobz/elasticsearch-head.git ​ # 在该目录下 cmd cd elasticsearch-head # 安装 npm install # 启动 npm run start # 访问 open HTTP://本地主机:9100然后在浏览器访问9100端口成功连接ES如果打开浏览器调试工具发现报错: Origin null is not allowed by Access-Control-Allow-Origin.原因是:head插件作为客户端要连接ES服务(localhost:9200),此时存在跨域问题,elasticsearch默认不允许跨域访问。设置elasticsearch允许跨域访问,在 config/elasticsearch.yml 后面增加以下参数:#开启cors跨域访问支持,默认为false http.cors.enabled: true #跨域访问允许的域名地址,(允许所有域名)使用正则 http.cors.allow-origin: /.*/3.ES入门1.创建索引库📦 索引库(Index)是什么?在 Elasticsearch 中,索引库(Index)是存储具有相同结构的文档(Document)的逻辑容器。类似于关系型数据库中的“数据库”;所有数据以 JSON 文档形式存入索引;索引名必须为小写(如user、logs);一个集群可包含多个索引。例如:商品数据 → 存在products索引中用户日志 → 存在user_logs索引中方式一:Postman参数字段说明推荐值number_of_shards主分片数量(决定数据分布和查询并行度)1(单节点开发用)3~5(生产建议)number_of_replicas副本分片数量(用于高可用和读性能)0(开发/测试可设为 0)1(生产建议)💡 举个例子:如果你有 3 个主分片 + 1 个副本 → 总共 6 个分片,分布在多个节点上;单节点时设为replicas: 0可避免浪费资源。方式二:可视化工具创建2.添加映射映射 = 字段名 + 字段类型 + 其他属性在 Elasticsearch 中,映射(Mapping)就是定义索引中文档字段的结构和数据类型的规则。就像数据库中的表结构(Schema),它告诉 ES:有哪些字段?每个字段是什么类型?(文本、数字、日期等)是否需要分词?是否可被搜索?发送:post http://localhost:9200/索引库名称/类型名称/_mapping由于ES6.0版本还没有将type彻底删除,所以暂时把type起一个没有特殊意义的名字。示例映射{ "properties": { "name": { "type": "text" }, "age": { "type": "integer" }, "class": { "type": "keyword" } } }name:用text类型,可以搜 “张” 匹配到 “张三”;age:用integer,可做范围查询(如查 16~18 岁);class:用keyword,确保 “高三(1)班” 不被拆开,能精确筛选。3.创建文档ES中的文档相当于MySQL数据库表中的记录。 发送:put 或Post http://localhost:9200/xin_search/doc/id值(如果不指定id值ES会自动生成ID)注意添加的文档数据要和映射中指定的数据类型对应一致4.搜索文档查询所有记录:get http://localhost:9200/xin_search/doc/_search根据ID查询数据信息 :get http://localhost:9200/xin_search/doc/1查询name中包含 姓张的学生信息:get http://localhost:9200/xin_search/doc/_search?q=name:张1.查询所有文档match_all{ "query": { "match_all": {} } }✅ 返回索引中全部数据(默认最多 10 条)。2.全文搜索(对 text 字段)match{ "query": { "match": { "name": "张" } } }✅ 搜索name中包含“张”的文档(会分词,支持模糊匹配)。🔍 适用于:商品名、文章标题、描述等文本搜索。3. 精确匹配(对 keyword / 数字 / 日期)term{ "query": { "term": { "class": "高三(2)班" } } }✅ 必须完全相等才匹配(不分词)。⚠️ 注意:不能用于text字段(除非用.keyword子字段)。4.范围查询range{ "query": { "range": { "age": { "gte": 16, "lte": 18 } } } }✅ 查找年龄在 16 到 18 岁之间的学生。操作符含义gtgte=ltlte=5. 组合多条件(最常用!)bool{ "query": { "bool": { "must": [ { "match": { "name": "李" } } ], "filter": [ { "term": { "class": "高二(5)班" } }, { "range": { "age": { "gte": 16 } } } ] } } }子句作用是否影响评分must必须满足(类似 AND)✅ 影响_scorefilter必须满足(但不打分)❌ 不影响,更快should至少满足一个(类似 OR)✅ 提升分数must_not必须不满足❌💡 推荐:过滤条件放filter,搜索关键词放must。6. 通配符查询(慎用)wildcard{ "query": { "wildcard": { "name": "张*" } } }*匹配任意字符(如 “张三”、“张小明”)?匹配单个字符⚠️ 性能差,不要在大索引上使用!7. 判断字段是否存在exists{ "query": { "exists": { "field": "age" } } }✅ 返回所有包含age字段的文档。使用方式(统一入口)所有查询都通过同一个 URL 发送:POST http://localhost:9200/xin_search/_searchBody 为上述 JSON。📌 快速参考表需求用哪个查询查所有match_all搜名字/标题match筛选状态、标签、分类term查价格/年龄范围range多条件组合bool