前一篇说了,怎么通过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();
}
}