经常搜索的索引被保留在内存中,因为重建索引和帮助高效搜索需要花费时间。另一方面,可能存在我们很少访问的索引。这些索引不需要占用内存,可以在需要时进行重建。这样的索引称为冻结索引。
每当搜索分片时,Elasticsearch都会构建冻结索引的每个分片的即时数据结构,并在搜索完成后立即丢弃这些数据结构。因为Elasticsearch不会在内存中维护这些临时数据结构,所以冻结索引消耗的堆要比普通索引少得多。与其他方式相比,这允许更高的磁盘与堆的比率。
总结来说索引的冻结是Elasticsearch提供的一个用于减少内存开销的操作,这个功能在7.14版本中被标记为Deprecated,在Version 8以后,已经对堆内存的使用进行了改进,冻结和解冻的功能不再适用,但在Version 8以前的版本中不失为一个可行的优化方案。
冻结和解冻示例
POST /index_name/_freeze -- 冻结
POST /index_name/_unfreeze -- 解冻
冻结索引示例
<dependency>
<groupId>org.elasticsearchgroupId>
<artifactId>elasticsearchartifactId>
<version>7.6.2version>
dependency>
<dependency>
<groupId>org.elasticsearch.clientgroupId>
<artifactId>elasticsearch-rest-high-level-clientartifactId>
<version>7.6.2version>
dependency>
在 Elasticsearch 6.X 版本中,searchRequest.setIgnoreThrottled(false) 方法已经被废弃。取而代之的是使用 IndicesOptions 类来设置索引选项。要设置 ignoreThrottled 参数为 false,您可以使用 IndicesOptions.fromOptions() 方法并传递适当的参数。
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.indices.options.IndicesOptions;
// 创建 SearchRequest 对象
SearchRequest searchRequest = new SearchRequest("index_name");
// 设置 IndicesOptions 对象
IndicesOptions options = IndicesOptions.fromOptions(false, false, false, false, false, false, false, false);
searchRequest.indicesOptions(options);
// 执行搜索请求
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// 处理搜索结果
SearchHit[] hits = searchResponse.getHits().getHits();
// 处理搜索结果...
在上述代码中,我们首先创建了一个 SearchRequest 对象,然后使用 IndicesOptions.fromOptions() 方法创建了一个 IndicesOptions 对象,并将参数设置为 false。接下来,我们通过调用 searchRequest.indicesOptions(options) 将该选项对象设置到搜索请求中。这样,搜索请求将遵循指定的索引选项,而不使用默认的 ignoreThrottled 参数值。
Elasticsearch集群内存占用高的问题可能有多种原因,解决方法也会因情况而异。以下是一些可能的解决方法:
综上所述,解决Elasticsearch集群内存占用高的问题需要从多个方面入手,包括优化查询语句、调整索引和分片设置、监控内存使用情况、调整JVM内存设置、定期清理数据、使用更新的Elasticsearch版本、分布式查询和使用缓存等。根据实际情况选择合适的解决方法可以有效地降低内存消耗并提高查询性能。
有关冻结索引的详细内容请参考:官方文档说明冻结索引