elasticsearch 索引 Warmer 管理

原创 2015年11月21日 16:00:31

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-warmers.html#removing
为什么要使用Warmer呢,这要看自己的数据和查询等条件,但是基本上都是有用的。在es启动时并不会加载任何数据,在查询前。因此,在查询前把需要的数据预加载到缓存中和启动I/O缓存(通过读硬盘上的segment数据),通过这种方式,所有的需要的信息都已经放置在缓存中,就能保证我们的查询获得了优化和所有需要的数据都已经准备好了。最后,通过一个实例简单说明使用warmer在初始查询时与普通方式查询的差距(参考 Mastering Elasticsearch for java 书籍的197页)。
使用warmer允许我们对索引注册一些我们常用的查询或者统计请求在查询时间进行预热(缓存),随着查询实时性的高要求,冷数据(segments)可以查询之前预热起来。特别是一些针对某些字段的负载比较大的统计或者排序,通过warmer API可以创建、删除和获取warmer信息。
可以通过index.warmer.enabled设置为false来禁用该功能。禁用curl命令:

curl -XPUT 'localhost:9200/mastering/_settings' -d '{
  "index.warmer.enabled": false
}'

mastering为索引名
一、创建Warmer

/**
 * <pre>
 * 以上代码在创建时需要制定查询条件,
 * query还是filter,addFacet,addAggregation,
 * 等查询。制定warmer后,需要重启ES才能看到效果,
 * 查询条件需要与设置的warmer定义的一致才行。
 * @param indexName 索引名
 * @param indexType 索引类型
 * @return
 * </pre>
 */
public void createWarmer(String indexName, String indexType){
   //创建Warmer//Puts an index search warmer to be applies when applicable.
    PutWarmerResponse response = getClient().admin().indices()         
      //warmer定义名
      .preparePutWarmer("warmerName")
        .setSearchRequest(
                //可以指定针对的索引和类型,类型不指定,则针对所有的类型
                getClient().prepareSearch(indexName).setTypes(indexType)
                //按照tgsj字段分组统计
//.addAggregation(AggregationBuilders.terms("tgsj").field("tgsj"))
//.addSort("cteareTime", SortOrder.DESC)
                .setPostFilter(FilterBuilders.termFilter("conCity", "000060"))
//.addFacet(FacetBuilders.termsFacet("tags").field("tags"))
                 ).execute().actionGet();

    System.out.println("操作是否成功:"+response.isAcknowledged());
}

测试用例:

@Test//
    public void createWarmer() throws Exception {
        esutils.createWarmer("esfindex","esftype");
    }

添加命令:

curl -XPUT localhost:9200/test/type1/_warmer/warmer_1 -d '{
"query" : {
    "match_all" : {}
},
"aggs" : {
    "aggs_1" : {
        "terms" : {
            "field" : "field"
            }
        }
    }
}'

test为索引名,type1为索引类型,warmer_1为warmer名;
二、查询Warmer

Java API方式:
/**
 * 获取Warmer信息
 * @param indexName
 * @param indexType
 */
public void getWarmer(String indexName, String indexType){
    GetWarmersResponse response = getClient().admin().indices()        
     .prepareGetWarmers(indexName).addTypes(indexType).get();

    ImmutableOpenMap<String, ImmutableList<IndexWarmersMetaData.Entry>>  map = response.getWarmers();
    Iterator<ObjectObjectCursor<String, ImmutableList<IndexWarmersMetaData.Entry>>>  itor = map.iterator();
    while(itor.hasNext()){
        ObjectObjectCursor<String, ImmutableList<IndexWarmersMetaData.Entry>>  enCursor = itor.next();
        System.out.println(enCursor.key);//索引名
        ImmutableList<IndexWarmersMetaData.Entry> id = enCursor.value;
        Iterator<IndexWarmersMetaData.Entry> ir =  id.iterator();
        while(ir.hasNext()){
            IndexWarmersMetaData.Entry ieEntry = ir.next();
            System.out.println(ieEntry.name());//warmer名
            System.out.println(FastJSONHelper.serialize(ieEntry));
        }
    }
}

命令:curl -XGET localhost:9200/esfindex/_warmer/warmerName?pretty
esfindex为索引名,支持通配符,如
curl -XGET localhost:9200/test/_warmer/warm*;
命令获取结果:

三、删除Warmer

Curl命令:
curl -DELETE HTTP://localhost:9200/esfindex/_warmer/warmerName
esfindex为索引名,warmerName为warmer名

Java api

/**
 * 删除指定索引的warmer
 * @param indexName 索引名
 * @param warmerName warmer名
 */
public void deleteWarmer(String indexName, String warmerName){
    //删除Warmer
    DeleteWarmerResponse response = getClient().admin().indices()
      .prepareDeleteWarmer()
        //索引名
      .setIndices(indexName)
        //warmer名
        .setNames(warmerName)
      .execute().actionGet();

    System.out.println("操作是否成功:"+response.isAcknowledged());
}

测试用例:

 @Test//
    public void deleteWarmer() throws Exception {
        esutils.deleteWarmer("esfindex","warmerName");
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

ElasticSearch初步学习,管理索引(入门二)

前一篇说了,怎么通过java客户端来创建索引,下面就记录下怎么来管理索引,包括mapping和删除等,(使用的版本是2.1.0) 官方api 官方api https://www.elastic.co/...
  • wangwuyilove
  • wangwuyilove
  • 2016年02月15日 17:45
  • 2129

清理elasticsearch的索引

直接到 elasticsearch data文件夹里删掉就行了,但怎么也得做的有点技术含量不是? 上网站看了看文档,其实也挺简单一条命令就行了 # curl -XDELETE 'http://172...
  • chengxuyuanyonghu
  • chengxuyuanyonghu
  • 2017年02月10日 12:09
  • 1655

Elasticsearch集群管理、优化以及监控

ES集群管理角色分配①设置某台机器只做主节点,不做索引和shard,负责cluster内部的协调,数据的读取由集群的各个节点,共同完成的,但是数据的修改只有在master上完成。 node.mast...
  • BlackEnn
  • BlackEnn
  • 2017年02月16日 20:56
  • 1390

Elasticsearch中的document数据格式,简单的集群管理,商品的索引的CRUD操作(学习资料记录)

1、Document数据格式面向文档的搜索分析引擎 (1)应用系统的数据结构都是面向对象的,复杂的。 (2)对象数据存储到数据库中,只能拆解开来,变为扁平的多张表,每次查询的时候还得还原回对象格式...
  • toto1297488504
  • toto1297488504
  • 2017年07月31日 22:21
  • 428

ElasticSearch初步学习,管理索引(入门二)

前一篇说了,怎么通过java客户端来创建索引,下面就记录下怎么来管理索引,包括mapping和删除等,(使用的版本是2.1.0) 官方api 官方api https://www.elastic.co/...
  • wangwuyilove
  • wangwuyilove
  • 2016年02月15日 17:45
  • 2129

[ElasticSearch2.x]Java API 之 索引管理

ElasticSearch为了便于处理索引管理(Indices administration)请求,提供了 org.elasticsearch.client.IndicesAdminClient接口...
  • SunnyYoona
  • SunnyYoona
  • 2016年10月11日 20:33
  • 7685

[Elasticsearch] 索引管理 (三) - 根对象(Root Object)

根对象(Root Object) 映射的最顶层被称为根对象。它包含了: 属性区域(Properties Section),列举了文档中包含的每个字段的映射信息。各种元数据(Metadata)字段,...
  • dm_vincent
  • dm_vincent
  • 2014年11月26日 10:06
  • 7910

ElasticSearch53:索引管理_定制自己的dynamic mapping策略

1.定制dynamic策略 true:遇到陌生字段,就进行dynamic mapping false:遇到陌生字段,就忽略 strict:遇到陌生字段,就报错 例子: PUT /inde...
  • m0_37557582
  • m0_37557582
  • 2018年01月09日 13:19
  • 17

ElasticSearch51:索引管理_内核级知识点_深入探秘type底层数据结构

1.每个index对应的type底层结构是怎样的? type,是一个index中用来区分类似的数据的数据结构,但是可能有不同的field,而且有不同的属性来控制索引建立、分词器 field的val...
  • m0_37557582
  • m0_37557582
  • 2018年01月08日 17:32
  • 11

ElasticSearch50:索引管理_快速上机动手实战修改分词器以及定制自己的分词器

1.默认的分词器 standard standard tokenizer:以单词的边界进行切分 standard token filter:什么都不做 lowercase token filt...
  • m0_37557582
  • m0_37557582
  • 2018年01月08日 17:31
  • 8
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:elasticsearch 索引 Warmer 管理
举报原因:
原因补充:

(最多只允许输入30个字)