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

前一篇说了,怎么通过java客户端来创建索引,下面就记录下怎么来管理索引,包括mapping和删除等,(使用的版本是2.1.0)

官方api 官方api https://www.elastic.co/guide/en/elasticsearch/client/java-api/2.x/index.html

一、删除索引

      1、根据indexName、typeName、id来删除

      client.prepareDelete(indexname, type,id).execute().actionGet();
https://www.elastic.co/guide/en/elasticsearch/client/java-api/2.x/java-docs-delete.html

       2、直接删除一个索引,包括这个索引下的全部文件   

client.admin().indices().prepareDelete(indexname).execute().actionGet();
        3、根据indexName和typeName来删除

        注意这个我没有找到合适的删除方式,在这里向看到的朋友请教下怎么来一次性删除同一个索引下相同的type下的索引

        以前的版本可以通过查询条件去删除数据,可以达到上面的目的

QueryBuilder qb = QueryBuilders.matchAllQuery();  
client.prepareDeleteByQuery(index).setType(type).setQuery(qb).execute();  
      现在我只能这样来删除

 /**
     * 根据索引名和type删除该索引数据
     * @param indexname 索引名
     * @param type 类型名
     */
    public static void delIndexs(String indexname,String type) {
		try {
			QueryBuilder query = QueryBuilders.matchAllQuery();
			SearchResponse searchResponse = client.prepareSearch(indexname).setTypes(type).setQuery(query)//.setScroll(new TimeValue(10000 ))
				.setFrom(0).setSize(10000).execute().actionGet();
			//查询到的结果集合
			SearchHits hits = searchResponse.getHits();
			SearchHit[] searchHists = hits.getHits();
			System.out.println("查询到记录数=" + hits.getTotalHits() + "=====" + searchHists.length);
			
			if(hits.getTotalHits() == 0){
				return;
			}
			
			BulkRequestBuilder brb = client.prepareBulk();
			
			for(SearchHit hit : searchHists){
				brb.add(new DeleteRequest(indexname,type,hit.getId()));
			}
			//执行
			brb.get();
			//递归删除
			delIndexs(indexname,type);
		}
		catch (Exception e) {
			e.printStackTrace();
		}
    }

有个朋友建议用命令来删除 curl -XDELETE http://hostname:port/index/type

这个我还没有来得及测试,也没有找到java来调用命令的方法。在这里请教一下。谢谢

二、mapping

什么是mapping
ES的mapping非常类似于静态语言中的数据类型:声明一个变量为int类型的变量, 以后这个变量都只能存储int类型的数据。同样的, 一个number类型的mapping字段只能存储number类型的数据。

同语言的数据类型相比,mapping还有一些其他的含义,mapping不仅告诉ES一个field中是什么类型的值, 它还告诉ES如何索引数据以及数据是否能被搜索到。

当你的查询没有返回相应的数据, 你的mapping很有可能有问题。当你拿不准的时候, 直接检查你的mapping。

剖析mapping
一个mapping由一个或多个analyzer组成, 一个analyzer又由一个或多个filter组成的。当ES索引文档的时候,它把字段中的内容传递给相应的analyzer,analyzer再传递给各自的filters。

filter的功能很容易理解:一个filter就是一个转换数据的方法, 输入一个字符串,这个方法返回另一个字符串,比如一个将字符串转为小写的方法就是一个filter很好的例子。

一个analyzer由一组顺序排列的filter组成,执行分析的过程就是按顺序一个filter一个filter依次调用, ES存储和索引最后得到的结果。
总结来说, mapping的作用就是执行一系列的指令将输入的数据转成可搜索的索引项。

默认analyzer
 ES猜测description字段是string类型,于是默认创建一个string类型的mapping,它使用默认的全局analyzer, 默认的analyzer是 标准analyzer , 这个标准analyzer有三个filter:token filter, lowercase filter和stop token filter。

 /**
     * 创建映射 mapping
     * @param indexName 索引名 index
     * @param typeName  类名  type
     */
    public static void defineIndexMapping(String indexName, String typeName){
		try {
		    XContentBuilder jsonBuild = XContentFactory.jsonBuilder();
		    jsonBuild.startObject()
		    	.startObject(typeName)
		    		.startObject("properties")
		    			.startObject("file1").field("type","string").field("index", "not_analyzed").endObject()
		    			.startObject("file2").field("type","string").field("index", "not_analyzed").endObject()
		    			.startObject("file3").field("type","string").field("index", "not_analyzed").endObject()
		    			.startObject("file4").field("type","string").field("index", "not_analyzed").endObject()
		    			.startObject("file5").field("type","long").endObject()
		    			.startObject("file6").field("type","string").field("index", "not_analyzed").endObject()
		    			.startObject("file7").field("type","string").field("index", "not_analyzed").endObject()
		    			.startObject("file8").field("type","string").field("index", "analyzed").endObject()
		    	        .endObject()
		    	.endObject()
		    .endObject();
		    
		    if(!isIndexName(indexName)){
				client.admin().indices().prepareCreate(indexName).addMapping(typeName, jsonBuild).execute().actionGet();
		    }else {
			PutMappingRequest putMappingRequest = Requests.putMappingRequest(indexName).type(typeName).source(jsonBuild);
			client.admin().indices().putMapping(putMappingRequest).actionGet();
			//client.close();
		    }
		}
		catch (IOException e) {
		    e.printStackTrace();
		}
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值