**java**
/**
* 合并索引片段
*/
@Test
public void testOptimize()
{
transportClient.admin().indices().prepareOptimize(“shb01”, “shb02”)
.setMaxNumSegments(1).get();
}
curl命令可以在linux中建立一个定时任务每天执行一次,同样java代码也可以建立一个定时器来执行。
## 2:内存设置
前介绍过es集群有两种启动方式
第一种是bin目录下bin/ elasticsearch
打开/usr/local/elasticsearch-1.4.4/bin/elasticsearch.in.sh文件修改文件中的两个参数,将 ES\_MIN\_MEM=256m和ES\_MAX\_MEM=1g的值改成一样一般设置为可用内存的60%,这样可以避免频繁的内存交换。
另一种是searchwrapper插件方式启动bin/service/ elasticsearch start
打开/usr/local/elasticsearch-1.4.4/bin/service/修改set.default.ES\_HEAP\_SIZE=1024
另外在es的配置文件中修改bootstrap.mlockall: true,这样禁止内存交换。
## 3:分片设置
3:分片设置
Es将数据存储在多个分片中那么分片的数量就影响到了查询效率。
分片数少了导致分片过大打开一个太大的分片太慢,分片数量过多查询时会打开过多的分片而且还有多台服务器之间的通信问题。所以过多过少都不行,一般情况下分片数量维持在5~20个之间单个分片最大不要超过20G。我们可以根据实际的业务来评估分片数量。
比如我有5个分片,预计3个月会产生100G的数据,那么我们可以每3个月当5个分片达到20G时就重新建立一个索引库。
## 4:副本设置
以设置2~3个副本即可。
另外当初次建立索引库时需要大量倒入数据时我们可以临时将副本改为0不让其同步数据以减轻服务器压力,倒入完成后通过mappings来更改副本数,这种方式只针对当前索引库后期添加的索引库仍会读取elasticsearch.yml中的副本个数,es重启后仍然会保持之前mappings修改的副本数。
## 5:删除文档
在es中删除一个文档后不会立即从硬盘中删除只会标记这个文档被删除,lucene会产生一个.del文件,而在检索过程中这个文件还会参与检索只不过在最后会被过滤掉,这样其实也会影响效率,我们可以定期删除这些文件,同合并索引片断一样可以通过curl和java两种方式来执行。
**Curl**
curl -XPOST http://192.168.79.131:9200/\_optimize?only\_expunge\_deletes=true
**Java**
/\*\*
* 删除.del文件
*/
@Test
public void testOptimizeDel()
{
transportClient.admin().indices().prepareOptimize(“shb01”, “shb02”)
.setOnlyExpungeDeletes(true).get();
}
## 6:日志输出
可以调整es的日志级别,es的默认级别是trace,超过500ms就属于慢查询就需要打印日志,一般改为info或error级别。
日志文件/usr/local/elasticsearch-1.4.4/config/logging.yml
ndex.search.slowlog: TRACE, index\_search\_slow\_log\_file 将TRACE改为INFO
或者更改elasticsearch.yml文件中对于慢查询的设置
index.search.slowlog.threshold.query.trace: 500ms
## 7:单态获取es对象
在java代码中使用单实例的方式来获取org.elasticsearch.client.transport.TransportClient对象。
## 8:es极速查询
Es将数据存储在不同的分片中,根据文档id通过内部算法得出要将文档存储在哪个分片上,所以在查询时只有指定在对应的分片上进行查询就可以实现基于es的极速查询,但是前提是你需要知道数据在那个分片上。
还可以通过路由参数来设置数据存储在同一个分片中,setRouting(“”)
/**
* 路由参数
*/
@Test
public void testRoutingInsert()
{
String source = “{“name”:“中山大学l”,“num”:1800}”;
IndexResponse indexResponse = transportClient.prepareIndex(index, “stu”)
.setRouting(“student”)
.setSource(source).get();
System.out.println(indexResponse.getVersion());
}
/\*\*
* 路由参数
*/
@Test
public void testRoutingSearch()
{
SearchResponse searchResponse = transportClient.prepareSearch(index)
.setTypes(“stu”)
.setQuery(QueryBuilders.matchAllQuery())
//.setPreference(“_shards:0,1,2”)
.setRouting(“student”, “teacher”)
.get();
SearchHits hits = searchResponse.getHits();
SearchHit[] hits2 = hits.getHits();
for(SearchHit h : hits2)
{
System.out.println(h.getSourceAsString());
}
}

## 9:去掉mapping中\_all域
**参考链接 :**
Elasticsearch笔记九之优化 :https://blog.youkuaiyun.com/ty4315/article/details/52531169