ElasticSearch的java api

时间:2021-10-31 03:01:05

pom

    <dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency> <dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
</dependencies>

创建索引

package com.zy.esapi;

import com.google.gson.Gson;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.HashMap; /**
* create by zy
* TODO:创建索引
*/
public class CreateIndexTest { private TransportClient client; private IndexResponse indexResponse; /**
* 创建client
*
* @throws UnknownHostException
*/
@Before
public void initClient() throws UnknownHostException {
client = new PreBuiltTransportClient(Settings.builder().put("cluster.name", "myes").build())
.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.44.41"), 9300))
.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.44.42"), 9300))
.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.44.43"), 9300));
} /**
* 常用的 map格式
*
* @throws Exception
*/
@Test
public void index1() throws Exception {
HashMap<String, String> jsonMap = new HashMap<String, String>();
jsonMap.put("id", "1");
jsonMap.put("name", "zhangsan");
jsonMap.put("sex", "1");
jsonMap.put("age", "18");
jsonMap.put("address", "beijing"); //index type id
indexResponse = client.prepareIndex("user", "baseinfo", "1")
.setSource(jsonMap)
.get();
} /**
* 自己拼装json
*
* @throws Exception
*/
@Test
public void index2() throws Exception {
String json = "{" +
"\"id\":\"2\"," +
"\"name\":\"kimchy\"," +
"\"sex\":\"1\"," +
"\"age\":\"22\"," +
"\"address\":\"shanghai\"" +
"}";
indexResponse = client.prepareIndex("user", "baseinfo", "2")
.setSource(json, XContentType.JSON)
.get(); } /**
* XcontentBuilder
*
* @throws IOException
*/
@Test
public void index3() throws IOException {
indexResponse = client.prepareIndex("user", "baseinfo", "3")
.setSource(new XContentFactory().jsonBuilder()
.startObject()
.field("id", "3")
.field("name", "lisi")
.field("age", "18")
.field("sex", "0")
.field("address", "beijing")
.endObject())
.get(); } /**
* 常用的 对象json格式
*/
@Test
public void index4() {
Gson gson = new Gson();
UserBaseInfo user = new UserBaseInfo("6", "xueyou", "13", "1", "xianggang");
String json = gson.toJson(user); indexResponse = client.prepareIndex("user", "baseinfo", user.getId())
.setSource(json, XContentType.JSON)
.get(); } /**
* 批量创建
* 批量操作,可以提高创建索引的速度,主要减少网络请求。
* 如果正常情况,创建一个文档就会发送一次网络请求,其实就是发起一次http请求。
* bulkIndex就可以将多个文档合并在一起之后,发送一次请求。
*
* @throws IOException
*/
@Test
public void index5() throws IOException {
BulkRequestBuilder bulk = client.prepareBulk();
bulk.add(client.prepareIndex("user", "baseinfo", "4")
.setSource(new XContentFactory().jsonBuilder()
.startObject()
.field("id", "4")
.field("name", "wangwu")
.field("age", "18")
.field("sex", "0")
.field("address", "hangzhou")
.endObject()));
bulk.add(client.prepareIndex("user", "baseinfo", "5")
.setSource(new XContentFactory().jsonBuilder()
.startObject()
.field("id", "5")
.field("name", "zhaoliu")
.field("age", "18")
.field("sex", "0")
.field("address", "shenzhen")
.endObject()));
BulkResponse bulkResponse = bulk.get();
System.out.println(bulkResponse);
} /**
* 打印返回信息
*/
@After
public void printResultAndCloseClient() {
System.out.println("index:" + indexResponse.getIndex());
System.out.println("type:" + indexResponse.getType());
System.out.println("id:" + indexResponse.getId());
System.out.println("version:" + indexResponse.getVersion());
System.out.println("status:" + indexResponse.getResult());
client.close();
}
}

删除索引

package com.zy.esapi;

import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.reindex.BulkByScrollResponse;
import org.elasticsearch.index.reindex.DeleteByQueryAction;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import java.net.InetAddress;
import java.net.UnknownHostException; /**
* create by zy
* TODO:
*/
public class DeleteIndexTest {
private TransportClient client;
private DeleteResponse response; @Before
public void init() throws UnknownHostException {
Settings settings = Settings.builder().put("cluster.name", "myes").build();
client = new PreBuiltTransportClient(settings)
.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.44.41"), 9300))
.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.44.42"), 9300))
.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.44.43"), 9300));
} @After
public void close() throws UnknownHostException {
if (response != null) {
String index = response.getIndex();
String type = response.getType();
String id = response.getId();
long version = response.getVersion();
System.out.println("index " + index + " type" + type + "" + id + "" + version + "" + version);
RestStatus status = response.status();
System.out.println("status:" + status.getStatus());
client.close();
}
} /**
* 根据文档进行删除
*
* @throws UnknownHostException
*/
@Test
public void delete1() throws UnknownHostException {
response = client.prepareDelete("user", "baseinfo", "1").get();
} @Test
/**
* 根据根据查询结果删除数据,并触发相关事件
*/
public void delete2() throws UnknownHostException {
DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
.filter(QueryBuilders.matchQuery("sex", "1"))
.source("user")
.execute(new ActionListener<BulkByScrollResponse>() {
public void onResponse(BulkByScrollResponse response) {
long deleted = response.getDeleted();
System.out.println("---------------" + deleted);
} public void onFailure(Exception e) {
System.out.println("------------错误了");
}
});
}
}

查询

package com.zy.esapi;

import com.google.gson.Gson;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetItemResponse;
import org.elasticsearch.action.get.MultiGetResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.MatchAllQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Before;
import org.junit.Test; import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList; /**
* create by zy
* TODO:查询
*/
public class QueryTest { private TransportClient client; /**
* 创建client
*
* @throws UnknownHostException
*/
@Before
public void initClient() throws UnknownHostException {
client = new PreBuiltTransportClient(Settings.builder().put("cluster.name", "myes").build())
.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.44.41"), 9300))
.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.44.42"), 9300))
.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.44.43"), 9300));
} /**
* 根据id查询一个
*/
@Test
public void query1() {
GetResponse response = client.prepareGet("user", "baseinfo", "1").get();
String index = response.getIndex();
String type = response.getType();
String id = response.getId(); System.out.println(response.getSourceAsString());
System.out.println(index);
System.out.println(type);
System.out.println(id); client.close();
} /**
* 查询多个id
*/
@Test
public void query2() {
MultiGetResponse responses = client.prepareMultiGet()
.add("user", "baseinfo", "1")
.add("user", "baseinfo", "2")
.add("user", "baseinfo", "3")
.add("user", "baseinfo", "4")
.get();
ArrayList<UserBaseInfo> users = new ArrayList<UserBaseInfo>();
for (MultiGetItemResponse response : responses) {
String json = response.getResponse().getSourceAsString();
Gson gson = new Gson();
UserBaseInfo user = gson.fromJson(json, UserBaseInfo.class);
users.add(user);
}
System.out.println(users); client.close();
} @Test
public void query3() {
SearchResponse response = client.prepareSearch("user").setTypes("baseinfo")
//所有的查询方式都可以直接new出来,
.setQuery(new MatchAllQueryBuilder())
//5.x以后如果用字段排序,需要在setting中预先设置fielddata=true
.addSort("id", SortOrder.DESC)
//浅分页
.setFrom(1).setSize(3)
.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
//docid没有值,旧版本有值
//int docId = hit.docId();
//System.out.println(docId);
}
} /**
*
DELETE user
PUT /user/?pretty
PUT user/_mapping/baseinfo
{
"properties":{
"id":{
"type":"text",
"fielddata":true
},
"name":{
"type":"text"
},
"age":{
"type":"text"
},
"sex":{
"type":"text"
},
"address":{
"type":"text"
}
}
}
*/ //--------------------------------search 高亮-------------------------------- //建立索引 需要用ik分词器
/**
* DELETE allarticle
* PUT /allarticle?pretty
* {
* "settings" : {
* "analysis" : {
* "analyzer" : {
* "ik" : {
* "tokenizer" : "ik_max_word"
* }
* }
* }
* },
* "mappings" : {
* "article" : {
* "dynamic" : true,
* "properties" : {
* "id" : {
* "type" : "text",
* "fielddata": true
* },
* "title" : {
* "type" : "text",
* "analyzer" : "ik_max_word"
* },
* "content" : {
* "type" : "text",
* "analyzer" : "ik_max_word"
* }
* }
* }
* }
* }
*/ /**
* 数据准备
*
* @throws UnknownHostException
*/
@Test
public void initPageData() throws UnknownHostException { for (int i = 1; i <= 100; i++) {
// 描述json 数据
Article article = new Article();
article.setId(i + "");
article.setTitle(i + "搜索工作其实很快乐");
article.setContent(i
+ "我们希望我们的搜索解决方案要快,我们希望有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP的索引数据,我们希望我们的搜索服务器始终可用,我们希望能够一台开始并扩展到数百,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。Elasticsearch旨在解决所有这些问题和更多的问题。"); Gson gson = new Gson();
String json = gson.toJson(article); // 建立文档
client.prepareIndex("allarticle", "article", article.getId())
.setSource(json, XContentType.JSON)
.get();
} //释放资源
client.close();
} @Test
//高亮查询
public void test11() throws Exception {
// 搜索数据
SearchRequestBuilder searchRequestBuilder = client
.prepareSearch("allarticle").setTypes("article")
//.setQuery(QueryBuilders.termQuery("title", "搜索"));
.setQuery(QueryBuilders.multiMatchQuery("搜索", "title", "content"));//这种多字段查询效率高些 //设置高亮数据
HighlightBuilder hiBuilder = new HighlightBuilder();
//设置格式
hiBuilder.preTags("<font style='color:red'>");
hiBuilder.postTags("</font>");
//设置字段
hiBuilder.field("title");
hiBuilder.field("content");
searchRequestBuilder.highlighter(hiBuilder); //获得查询结果数据
SearchResponse searchResponse = searchRequestBuilder.get(); //获取查询结果集
SearchHits searchHits = searchResponse.getHits();
System.out.println("共搜到:" + searchHits.getTotalHits() + "条结果!");
//遍历结果
for (SearchHit hit : searchHits) {
System.out.println("start************************************");
System.out.println("String方式打印文档搜索内容:");
System.out.println(hit.getSourceAsString());
System.out.println("-----------------------------------------");
System.out.println("Map方式打印高亮内容");
System.out.println(hit.getHighlightFields()); System.out.println("-----------------------------------------");
System.out.println("遍历高亮集合,打印高亮片段:");
Text[] titles = hit.getHighlightFields().get("title").getFragments();
for (Text str : titles) {
System.out.println(str);
} Text[] contents = hit.getHighlightFields().get("content").getFragments();
for (Text str : contents) {
System.out.println(str);
}
System.out.println("end**************************************");
} //释放资源
client.close();
} }

其他类

package com.zy.esapi;

/**
* create by zy
* TODO:
*/
public class Article {
private String id;
private String title;
private String content; public Article() {
} public Article(String id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
} @Override
public String toString() {
return "Article{" +
"id='" + id + '\'' +
", title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
} package com.zy.esapi; import java.io.Serializable; /**
* create by zy
* TODO:
*/
public class UserBaseInfo implements Serializable {
private String id;
private String name;
private String age;
private String sex;
private String address; public UserBaseInfo() {
} public UserBaseInfo(String id, String name, String age, String sex, String address) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.address = address;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getAge() {
return age;
} public void setAge(String age) {
this.age = age;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} @Override
public String toString() {
return "UserBaseInfo{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age='" + age + '\'' +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}