elasticsearch-6.4.3 java代码操作ES
这次我讲的是6.4.3版本的elasticsearch相关java代码,其余版本的elasticsearch用这套代码不一定会好使,所以说看的时候请注意你的elasticsearch版本号和我的版本号是否相同,如果不同的话,估计这套代码对你基本没啥作用。
在贴代码之前先说下elasticsearch几个关键的属性由那些
- 近实时查询
- 节点和集群
- 文档
- 索引
- 类型
- 分片和复制
具体的概念和elasticsearch的安装配置就不说了,百度一搜一大把,我就直接上代码了。
/**
* 初始化客户端连接
*/
private static TransportClient client;
public Client initESClient() {
// 配置你的es,如果你的集群名称不是默认的elasticsearch,需要以下这步
Settings settings = Settings.builder().put("cluster.name","elasticsearch")
.put("client.transport.ignore_cluster_name", true)
.build();
// 这里可以同时连接集群的服务器,可以多个,并且连接服务是可访问的
try {
// 创建client
client = new PreBuiltTransportClient(settings)
.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.1.112"), 9300))
;
} catch (UnknownHostException e) {
e.printStackTrace();
}finally
{
if(client != null)
{
System.out.println("连接成功!");
}
}
return client;
}
/**
* 关闭客户端连接
*/
public void closeESClient() {
client.close();
System.out.println("连接关闭!");
}
/**
* 创建索引
*/
@SuppressWarnings("unused")
private void createIndex() {
try {
//创建映射
//title:字段名, type:文本类型 analyzer :分词器类型
XContentBuilder mapping = jsonBuilder()
.startObject()
.startObject("properties")
.startObject("title").field("type", "text").field("analyzer", "ik_smart").endObject() //该字段添加的内容,查询时将会使用ik_smart分词
.startObject("content").field("type", "text").field("analyzer", "ik_max_word").endObject()
.endObject()
.endObject();
//index:索引名 type:类型名(可以自己定义)
PutMappingRequest putmap = Requests.putMappingRequest("yzy").type("type").source(mapping);
//创建索引
client.admin().indices().prepareCreate("yzy").execute().actionGet();
//为索引添加映射
client.admin().indices().putMapping(putmap).actionGet();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 添加数据
* **/
public void addIndex()throws IOException{
try{
//prepareIndex(索引,文本类型,ID)
IndexResponse response = client.prepareIndex("yzy", "type", "1")
.setSource(jsonBuilder()
.startObject()
.field("title", "标题") //字段,值
.field("content", "内容")
.endObject()
).get();
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 更新索引
* **/
public void updateByClient() throws IOException, ExecutionException, InterruptedException {
//每次添加id应该不同,相当于数据表中的主键,相同 的话将会进行覆盖
UpdateResponse response = client.update(new UpdateRequest("yzy", "type", "1")
.doc(XContentFactory.jsonBuilder()
.startObject()
.field("title", "标题1")
.field("content","Hello world!!!")
.endObject()
)).get();
}
/**
* 获取指定文档
* index 索引
* type 类型
* idtype id
*/
public Map<String,Object> get(String index,String type,String idtype){
GetResponse response = client.prepareGet(index, type,idtype).get();
Map<String, Object> source = response.getSource();
Set<String> strings = source.keySet();
Iterator<String> iterator = strings.iterator();
while (iterator.hasNext()) {
System.out.println(source.get(iterator.next()));
}
return source;
}
/**
* 搜索索引 例子
* index索引 school_index
* type 类型 doc
* query 属性 address
* cxz 查询值 西城
*/
public List<Map<String,Object>> search(String index,String type,String query,String cxz){
final List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
SearchResponse sr = client.prepareSearch() //指定多个索引
.setTypes(index, type) //指定类型
.setSearchType(SearchType.QUERY_THEN_FETCH)
.setQuery(QueryBuilders.matchQuery(query, cxz)) // Query
.setFrom(0).setSize(60).setExplain(true)
.get();
long totalHits1= sr.getHits().totalHits; //命中个数
for (SearchHit searchHit : sr.getHits().getHits()) {
final Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
list.add(sourceAsMap);
}
System.out.println(totalHits1+"---"+sr.toString());
return list;
}
/**
* 删除
*/
public void delete(){
//DeleteResponse response = client.prepareDelete("customertest", "joey", "1").get(); //删除文档
//删除索引
DeleteIndexResponse deleteIndexResponse = client.admin().indices()
.prepareDelete("yzy")
.execute().actionGet();
boolean isFound = deleteIndexResponse.isAcknowledged();
System.out.println(isFound);//返回文档是否存在,存在删除
}
/**
* 批量新增
*/
public void bulkdoc() throws IOException
{
BulkRequestBuilder bulkRequest = client.prepareBulk();
bulkRequest.add(client.prepareIndex("twitter", "tweet", "1")
.setSource(jsonBuilder()
.startObject()
.field("user", "kimchy")
.field("postDate", new Date())
.field("message", "trying out Elasticsearch")
.endObject()
)
);
bulkRequest.add(client.prepareIndex("twitter", "tweet", "2")
.setSource(jsonBuilder()
.startObject()
.field("user", "kimchy")
.field("postDate", new Date())
.field("message", "another post")
.endObject()
)
);
BulkResponse bulkResponse = bulkRequest.get();
if (bulkResponse.hasFailures()) {
// process failures by iterating through each bulk response item
}
}
/**
* 全文查询(根据属性值查询)
* query 属性名
* msg 查询值
* **/
public List<Map<String,Object>> searchZd(String query,String msg){
Map<String, Object> template_params = new HashMap<String, Object>();
template_params.put("param_gender", msg);
template_params.put("param_query", query);
final List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
//模板查询
SearchResponse sr = new SearchTemplateRequestBuilder(client)
.setScript("{\n" +
" \"query\" : {\n" +
" \"match\" : {\n" +
" \"{{param_query}}\" : \"{{param_gender}}\"\n" +
" }\n" +
" }\n" +
"}")
.setScriptType(ScriptType.INLINE)
.setScriptParams(template_params)
.setRequest(new SearchRequest())
.get()
.getResponse();
long totalHits1= sr.getHits().totalHits; //命中个数
for (SearchHit searchHit : sr.getHits().getHits()) {
final Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
list.add(sourceAsMap);
}
System.out.println(totalHits1+"---"+sr.toString());
return list;
}
/**
* 全文查询
* msg 查询值
* **/
public List<Map<String,Object>> searchEs(String msg){
Map<String, Object> template_params = new HashMap<String, Object>();
template_params.put("param_gender", msg);
final List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
//模板查询
SearchResponse sr = new SearchTemplateRequestBuilder(client)
.setScript("{\n" +
" \"query\" : {\n" +
" \"query_string\" : {\n" +
" \"query\" : \"{{param_gender}}\"\n" +
" }\n" +
" }\n" +
"}")
.setScriptType(ScriptType.INLINE)
.setScriptParams(template_params)
.setRequest(new SearchRequest())
.get()
.getResponse();
long totalHits1= sr.getHits().totalHits; //命中个数
for (SearchHit searchHit : sr.getHits().getHits()) {
final Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
list.add(sourceAsMap);
}
System.out.println(totalHits1+"---"+sr.toString());
return list;
}