cBlog - ElasticSearch
type: channel
link: https://blog.oalo.cn/tag/ElasticSearch/
items: Elasticsearch Linux 服务器安装使用指南
items: ES-RestHighLevelClient查询文档
items: ES-DSL查询文档&搜索结果处理
items: ES-RestClient操作文档
items: ElasticSearch(ES)索引库与文档的创建和操作
items: ES-初始化RestClient

Elasticsearch Linux 服务器安装使用指南
type: item
date: 2025-11-06T09:51:00+08:00
description: 目录1. 简介2. 环境要求3. 安装前准备4. 安装 Elasticsearch5. 配置 Elasticsearch6. 启动与管理服务7. 验证安装8. 基本使用9. 安全配置10. 性能优化11. 常见问题与解决方案12. 备份与恢复1. 简介Elasticsearch 是一个基于 Apache Lucene 的开源分布式搜索和分析引擎，适用于所有类型的数据，包括文本、数字、地理空间、结构化和非结构化数据。主要特性分布式架构：自动分片和副本管理RESTful API：通过 HTTP 进行交互近实时搜索：索引后几乎立即可搜索全文检索：强大的文本搜索和分析能力高可用性：支持集群和自动故障转移2. 环境要求2.1 硬件要求组件最低配置推荐配置CPU2核4核以上内存4GB16GB以上磁盘10GB100GB以上 SSD网络100Mbps1Gbps💡 资源受限环境说明如果您的服务器配置为 2核2G，Elasticsearch 仍然可以运行，但需要进行以下调整：JVM 堆内存：设置为 512MB-1GB（不超过物理内存的50%）索引分片数：减少分片数量，单节点环境建议设置为1索引副本数：设置为0（单节点无需副本）刷新间隔：增加到30s或更长，减少资源消耗数据量限制：建议数据量不超过10GB并发请求：限制并发查询数，避免OOM# 2核2G 环境推荐的 JVM 配置 -Xms512m -Xmx1g2.2 软件要求操作系统：CentOS 7/8、Ubuntu 18.04/20.04/22.04、RHEL 7/8Java：JDK 11 或更高版本（Elasticsearch 8.x 自带 OpenJDK）依赖包：glibc 2.17 或更高版本2.3 系统参数要求最大文件描述符：至少 65535最大线程数：至少 4096虚拟内存：至少 2621443. 安装前准备3.1 创建 Elasticsearch 用户# 创建 elasticsearch 用户组和用户 sudo groupadd elasticsearch sudo useradd -g elasticsearch -s /bin/bash -m elasticsearch # 设置密码（可选） sudo passwd elasticsearch3.2 配置系统参数3.2.1 修改文件描述符限制# 编辑 limits.conf sudo vim /etc/security/limits.conf # 添加以下内容 elasticsearch soft nofile 65535 elasticsearch hard nofile 65535 elasticsearch soft nproc 4096 elasticsearch hard nproc 40963.2.2 修改虚拟内存# 编辑 sysctl.conf sudo vim /etc/sysctl.conf # 添加以下内容 vm.max_map_count=262144 # 使配置生效 sudo sysctl -p3.2.3 禁用 Swap（推荐）# 临时禁用 sudo swapoff -a # 永久禁用，编辑 /etc/fstab，注释掉 swap 行 sudo vim /etc/fstab # 注释掉类似这样的行： # /dev/mapper/centos-swap swap swap defaults 0 03.3 安装 Java（如果需要）# CentOS/RHEL sudo yum install java-11-openjdk java-11-openjdk-devel -y # Ubuntu/Debian sudo apt update sudo apt install openjdk-11-jdk -y # 验证 Java 安装 java -version4. 安装 Elasticsearch4.1 方法一：使用 RPM 包安装（CentOS/RHEL）4.1.1 导入 GPG 密钥sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch4.1.2 创建 Yum 仓库选项 A：官方源（国外）sudo vim /etc/yum.repos.d/elasticsearch.repo添加以下内容：[elasticsearch] name=Elasticsearch repository for 8.x packages baseurl=https://artifacts.elastic.co/packages/8.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-el…

ES-RestHighLevelClient查询文档
type: item
date: 2023-10-25T18:13:00+08:00
description: RestHighLevelClient操作查询文档查询操作基本步骤//注入依赖 @Autowired private RestHighLevelClient restHighLevelClient; //1.创建查询索引对象 SearchRequest request = new SearchRequest("索引库名"); //2.创建构生成器对象 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders qbs); //可以直接写成 => request.source().query(QueryBuilders qbs); //不创建对象 //3.传入生成器 request.source(sourceBuilder); //4.发送请求 SearchResponse response = client.search(request, RequestOptions.DEFAULT); //5.解析响应数据 handleResponse(response);批量同步 //数据库同步索引库-批量操作 @Test void testBulkNewRequest() throws IOException { //分页打包添加 批量导入文档 int page = 1; int size = 100; Page<Hotel> hotelPage = hotelService.page(new Page<>(page, size)); for (long i = 1; i <= hotelPage.getPages(); i++) { Page<Hotel> hotelData = hotelService.page(new Page<>(i, size)); BulkRequest bulkRequest = new BulkRequest(); for (Hotel hotel : hotelData.getRecords()) { HotelDoc hotelDoc = new HotelDoc(hotel); String hotelString = JSONObject.toJSONString(hotelDoc); bulkRequest.add(new IndexRequest("hotel") .id(hotelDoc.getId().toString()) .source(hotelString, XContentType.JSON)); } client.bulk(bulkRequest, RequestOptions.DEFAULT); } }文档的增删改查操作class HotelDocumentTest { @Autowired private RestHighLevelClient client; @Autowired private IHotelService hotelService; /** * 文档的增删改查操作 * * @throws IOException io */ @Test void testAddDoc() throws IOException { //1.查询数据库hotel数据 Hotel hotel = hotelService.getById(61083); //2.转换为HotelDoc HotelDoc hotelDoc = new HotelDoc(hotel); //3.转换成json String jsonString = JSONObject.toJSONString(hotelDoc); //4.准备request IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString()); //5.这是发送的文档 request.source(jsonString, XContentType.JSON); client.index(request, RequestOptions.DEFAULT); } @Test void testGetDoc() throws IOException { //1.准备Request GetRequest request = new GetRequest("hotel").id("61083"); //2.发送请求 GetResponse response = client.get(request, RequestOptions.DEFAULT); //3.解析响应 String source = response.…

ES-DSL查询文档&搜索结果处理
type: item
date: 2023-10-25T12:19:00+08:00
description: DSL查询文档查询所有：查询出所有数据，一般测试用。例如：match_all全文检索（full text）查询：利用分词器对用户输入内容分词，然后去倒排索引库中匹配。例如：match_querymulti_match_query精确查询：根据精确词条值查找数据，一般是查找keyword、数值、日期、boolean等类型字段。例如：idsrangeterm地理（geo）查询：根据经纬度查询。例如：geo_distancegeo_bounding_box复合（compound）查询：复合查询可以将上述各种查询条件组合起来，合并查询条件。例如：boolfunction_score1.全文检索查询#match查询 //搜索字段越多，对查询性能影响越大，因此建议采用copy_to，然后单字段查询的方式比较好 GET /hotel/_search { "query": { "match": { "all":"上海外滩" } } } #multi_match查询 GET /hotel/_search { "query": { "multi_match": { "query": "如家", "fields": ["name","business"] } } }2.精准查询2.1term查询因为精确查询的字段搜是不分词的字段，因此查询的条件也必须是不分词的词条。查询时，用户输入的内容跟自动值完全匹配时才认为符合条件。如果用户输入的内容过多，反而搜索不到数据。//term 精准查询 GET /hotel/_search { "query": { "term": { "name": { "value": "上海" } } } }2.22.range查询范围查询，一般应用在对数值类型做范围过滤的时候。比如做价格范围过滤//range 范围查询 GET /hotel/_search { "query": { "range": { "price": { "gte": 100, "lte": 200 } } } }3.地理坐标查询所谓的地理坐标查询，其实就是根据经纬度查询官方文档：https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-queries.html常见的使用场景包括：携程：搜索我附近的酒店滴滴：搜索我附近的出租车微信：搜索我附近的人#geo_bounding_box矩形查询 GET /hotel/_search { "query": { "geo_bounding_box":{ "location":{ "top_left":{ "lat":31.1, "lon":121.5 }, "bottom_right":{ "lat":30.9, "lon":121.7 } } } } }#geo_distance 距离查询 GET /hotel/_search { "query": { "geo_distance":{ "distance":"100km", "location":"39.909187,116.397455" //天安门 } } }4.算分函数查询function score 查询中包含四部分内容：原始查询条件：query部分，基于这个条件搜索文档，并且基于BM25算法给文档打分，原始算分（query score)过滤条件：filter部分，符合该条件的文档才会重新算分算分函数：符合filter条件的文档要根据这个函数做运算，得到的函数算分（function score），有四种函数weight：函数结果是常量field_value_factor：以文档中的某个字段值作为函数结果random_score：以随机数作为函数结果script_score：自定义算分函数算法运算模式：算分函数的结果、原始查询的相关性算分，两者之间的运算方式，包括：multiply：相乘replace：用function score替换query score其它，例如：sum、avg、max、min#算分查询 GET /hotel/_search { "query": { "function_score": { "query": { "match": { "all": "外滩" } }, "functions": [ { "filter": { "term": { "brand": "如家" } }, "weight": 10 //加权重 } ], "boost_mode": "sum" } } }5.布尔查询布尔查询是一个或多个查询子句的组合，每一个子句就是一个子查询。子查询的组合方式有：must：必须匹配每个子查询，类似“与”should：选择性匹配子查询，类似“或”must_…

ES-RestClient操作文档
type: item
date: 2023-10-25T10:09:16+08:00
description: RestClient操作文档初始化RestClient在elasticsearch提供的API中，与elasticsearch一切交互都封装在一个名为RestHighLevelClient的类中，必须先完成这个对象的初始化，建立与elasticsearch的连接。分为三步：1）引入es的RestHighLevelClient依赖：<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>2）因为SpringBoot默认的ES可能版本不一致，所以我们需要覆盖默认的ES版本：<properties> <java.version>1.8</java.version> <elasticsearch.version>7.12.1</elasticsearch.version> </properties>3）初始化RestHighLevelClient：初始化的代码如下：//可以使用配置类交给ioc @Configuration public class ESConfig { @Bean public RestHighLevelClient restHighLevelClient() { return new RestHighLevelClient( RestClient.builder( new HttpHost("00.0xx.x0x.xxx", 9200, "http") )); } } 索引库相关操作@SpringBootTest class HotelIndexTest { @Autowired private RestHighLevelClient client; //创建索引库 @Test void testCreateIndex() throws Exception { // 1.准备Request PUT /hotel CreateIndexRequest request = new CreateIndexRequest("hotel"); // 2.准备请求参数 request.source(MAPPING_TEMPLATE, XContentType.JSON); // 3.发送请求 client.indices().create(request, RequestOptions.DEFAULT); } //删除索引库 @Test void testDeleteIndex() throws IOException { // 1.准备Request DeleteIndexRequest request = new DeleteIndexRequest("hotel"); // 2.判断存不存在 GetIndexRequest indexRequest = new GetIndexRequest("hotel"); boolean exists = client.indices().exists(indexRequest, RequestOptions.DEFAULT); if (!exists) { System.out.println("不存在哦！"); return; } // 3.发送请求 client.indices().delete(request, RequestOptions.DEFAULT); } //判断是否存在 @Test void testGetIndex() throws IOException { GetIndexRequest request = new GetIndexRequest("hotel"); boolean exists = client.indices().exists(request, RequestOptions.DEFAULT); System.out.println(exists ? "存在" : "不存在"); } }Document文档操作@SpringBootTest class HotelDocumentTest { @Autowired private RestHighLevelClient client; @Autowired private IHotelService hotelService; @Test void testAddDoc() throws IOException { //1.查询数据库hotel数据 Hotel hotel = hotelService.getById(61083); //2.转换为HotelDoc HotelDoc h…

ElasticSearch(ES)索引库与文档的创建和操作
type: item
date: 2023-10-24T18:02:00+08:00
description: ElasticSearch(ES)索引库与文档的创建和操作索引库操作有哪些？创建索引库：PUT /索引库名查询索引库：GET /索引库名删除索引库：DELETE /索引库名添加字段：PUT /索引库名/_mapping##创建索引库 PUT /test { "mappings": { "properties": { "info": { "type": "text", "analyzer": "ik_smart" }, "email": { "type": "keyword", "index": false }, "name":{ "type": "object", "properties": { "firstName":{ "type":"keyword" }, "lastName":{ "type":"keyword" } } } } } } #查询索引库 GET /test/_mapping GET /test/_search #修改（新增）索引库字段 PUT /test/_mapping { "properties":{ "age":{ "type":"integer" }, "weight":{ "type":"float" }, "isMarried":{ "type":"boolean" }, "score":{ "type":"float" } } } #删除数据库 DELETE /test文档操作有哪些？创建文档：POST /{索引库名}/_doc/文档id { json文档 }查询文档：GET /{索引库名}/_doc/文档id删除文档：DELETE /{索引库名}/_doc/文档id修改文档：全量修改：PUT /{索引库名}/_doc/文档id { json文档 }增量修改：POST /{索引库名}/_update/文档id { "doc": {字段}}## 文档操作 #新增文档 POST /test/_doc/1 { "info":"我是大帅哥", "email":"admin@oalo.cn", "name":{ "firstName":"哥", "lastName":"帅" }, "age": "18", "weight":"120", "score":[99,99,100], "isMarried":false } #查询所有 GET /test/_search #根据id查询 GET /test/_doc/1 #根据id进行删除文档 DELETE /test/_doc/1 # 修改文档 #1.全量修改 PUT /test/_doc/1 { "info":"我依旧是大帅哥", "email":"admin@oalo.cn", "name":{ "firstName":"比", "lastName":"帅" }, "age": "18", "weight":"110", "score":[99,99,100], "isMarried":false } #2.增量修改 POST /test/_update/1 { "doc": { "email":"521@oalo.cn" } }

ES-初始化RestClient
type: item
date: 2023-10-24T16:20:00+08:00
description: 1）引入es的RestHighLevelClient依赖：<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>2）因为SpringBoot默认的ES版本是7.6.2，所以我们需要覆盖默认的ES版本：<properties> <java.version>1.8</java.version> <elasticsearch.version>7.12.1</elasticsearch.version> </properties>3）初始化RestHighLevelClient：初始化的代码如下：@Getter @Setter @Configuration @ConfigurationProperties(prefix = "elasticsearch") public class ElasticSearchConfig { private String host; private int port; @Bean public RestHighLevelClient client(){ System.out.println(host); System.out.println(port); return new RestHighLevelClient(RestClient.builder( new HttpHost( host, port, "http" ) )); } }#自定义elasticsearch连接配置 elasticsearch: host: 192.168.200.130 port: 9200