目录
一、JAVA连接ES
1、添加依赖
<!-- elasticsearch -->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.5.4</version>
</dependency>
<!-- elasticsearch高级API -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.5.4</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<!--provided:编译期有效-->
<scope>provided</scope>
</dependency>
2、在utils目录下创建EsClient 类
创建EsClient 连接
注意:需要先打开elasticsearch,然后配置下面的host连接
public class EsClient {
public static RestHighLevelClient getClient(){
// 创建 HttpHost
HttpHost httpHost = new HttpHost("127.0.0.1",9200);
// 创建 RestClientBuilder
RestClientBuilder builder = RestClient.builder(httpHost);
// 创建 RestHighLevelClient
RestHighLevelClient client = new RestHighLevelClient(builder);
return client;
}
}
3、在test类中测试
@Test
public void testConnect() {
try {
RestHighLevelClient client = ESClient.getClient();
System.out.println("ok!");
} catch (Exception e) {
System.out.println(e);
}
}
连接成功:
二、索引
1、创建索引
RestHighLevelClient client = EsClient.getClient();
String index = "person";
String type="man";
@Test
public void createIndx() throws Exception{
// 1.准备关于索引的setting
Settings.Builder settings = Settings.builder()
.put("number_of_shards", 2) //指定索引的分片数
.put("number_of_replicas", 1); //指定索引的备份数
// 2.准备关于索引的mapping
XContentBuilder mappings = JsonXContent.contentBuilder()
.startObject()
.startObject("properties")
.startObject("name")
.field("type", "text")
.endObject()
.startObject("age")
.field("type", "integer")
.endObject()
.startObject("birthday")
.field("type", "date")
.field("format", "yyyy-MM-dd")
.endObject()
.endObject()
.endObject();
// 3.将settings和mappings 封装到到一个Request对象中
CreateIndexRequest request = new CreateIndexRequest(index)
.settings(settings)
.mapping(type,mappings);
// 4.使用client 去连接ES
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
System.out.println("response:"+response.toString());
}
2、效果
3、删除索引
//删除索引
RestHighLevelClient client = EsClient.getClient();
String index = "person";
String type="man";
@Test
public void deleteIndex() throws Exception{
//1.准备request对象
GetIndexRequest request=new GetIndexRequest();
request.indices(index);
//2.通过Cilent操作
RestHighLevelClient client = EsClient.getClient();
boolean exists= client.indices().exists(request,RequestOptions.DEFAULT);
//3.输出
if (exists){
// 1.获取request
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(index);
// 2.使用client 操作request 删除索引
AcknowledgedResponse delete = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
// 3.输出结果
System.out.println(delete.isAcknowledged());
}else {
System.out.println("没有该索引");
}
}
三、文档操作
1、添加文档
首先导入jackson依赖
<!-- jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
创建实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class KeyText {
@JsonIgnore
private Integer id;
private String kwname;
private String text;
}
测试:
ObjectMapper mapper = new ObjectMapper();
RestHighLevelClient client = EsClient.getClient();
String index = "keytext";
String type="ktext";
//添加文档
@Test
public void createDocTest() throws IOException {
// 1.准备一个json数据
KeyText keyText = new KeyText(1,"ws","ws内容");
String json = mapper.writeValueAsString(keyText);
// 2.创建一个request对象(手动指定的方式创建)
IndexRequest request = new IndexRequest(index,type,keyText.getId().toString());
request.source(json, XContentType.JSON);
// 3.使用client 操作request对象生成doc
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
// 4.输出返回结果
System.out.println(response.getResult().toString());
}
2、修改文档
ObjectMapper mapper = new ObjectMapper();
RestHighLevelClient client = EsClient.getClient();
String index = "keytext";
String type="ktext";
//修改文档
@Test
public void updateDocTest() throws Exception{
// 1.创建要更新的Map
Map<String,Object> doc = new HashMap<>();
doc.put("kwname","ps");
// 2.创建request, 将doc 封装进去
UpdateRequest request = new UpdateRequest(index,type,"1");
request.doc(doc);
// 3. client 去操作 request
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
// 4.输出 更新结果
System.out.println(response.getResult());
}
3、删除文档
ObjectMapper mapper = new ObjectMapper();
RestHighLevelClient client = EsClient.getClient();
String index = "keytext";
String type="ktext";
@Test
public void deleteDocTest() throws Exception{
// 1.封装删除对象
DeleteRequest request = new DeleteRequest(index,type,"1");
// 2 client 操作 request对象
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
// 3.输出结果
System.out.println(response.getResult().toString());
}
4、批量操作 新增
ObjectMapper mapper = new ObjectMapper();
RestHighLevelClient client = EsClient.getClient();
String index = "keytext";
String type="ktext";
@Test
public void bulkCreateDoc() throws Exception{
// 1.准备多个json 对象
KeyText keyText1 = new KeyText(1,"ws","ws内容");
KeyText keyText2 = new KeyText(2,"ps","ps内容");
KeyText keyText3 = new KeyText(3,"ea","ea内容");
String json1 = mapper.writeValueAsString(keyText1);
String json2 = mapper.writeValueAsString(keyText2);
String json3 = mapper.writeValueAsString(keyText3);
// 2.创建request
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.add(new IndexRequest(index,type,keyText1.getId().toString()).source(json1,XContentType.JSON))
.add(new IndexRequest(index,type,keyText2.getId().toString()).source(json2,XContentType.JSON))
.add(new IndexRequest(index,type,keyText3.getId().toString()).source(json3,XContentType.JSON));
// 3.client 执行
BulkResponse responses = client.bulk(bulkRequest, RequestOptions.DEFAULT);
// 4.输出结果
System.out.println(responses.getItems().toString());
}
5、批量 删除
ObjectMapper mapper = new ObjectMapper();
RestHighLevelClient client = EsClient.getClient();
String index = "keytext";
String type="ktext";
@Test
public void bulkDelete() throws Exception{
// 1.创建Request 对象
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.add(new DeleteRequest(index,type,"1"));
bulkRequest.add(new DeleteRequest(index,type,"2"));
bulkRequest.add(new DeleteRequest(index,type,"3"));
// 2.执行
BulkResponse re = client.bulk(bulkRequest, RequestOptions.DEFAULT);
// 3.输出结果
System.out.println(re.toString());
}
6、批量导入数据库数据到ES
/**
* 添加文章
* @throws IOException
*/
@Autowired
KeyWordService keyWordService;
ObjectMapper mapper = new ObjectMapper();
RestHighLevelClient client = EsClient.getClient();
String index = "keywordlist";
String type="tweet";
@Test
public void addDOC2() throws IOException{
// 1.准备一个json数据
List<KeyWord> keyWordList = keyWordService.findAll();
for (int i = 0; i < keyWordList.size(); i++) {
String json = mapper.writeValueAsString(keyWordList.get(i));
// 2.创建一个request对象(手动指定的方式创建)
IndexRequest request = new IndexRequest(index,type,keyWordList.get(i).getKwid());
request.source(json, XContentType.JSON);
// 3.使用client 操作request对象生成doc
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
// 4.输出返回结果
System.out.println(response.getResult().toString());
}
}
四、封装查询
1、准备EsClient类连接ES
public class EsClient {
public static RestHighLevelClient getClient(){
// 创建 HttpHost
HttpHost httpHost = new HttpHost("47.115.5.93",9200);
// 创建 RestClientBuilder
RestClientBuilder builder = RestClient.builder(httpHost);
// 创建 RestHighLevelClient
RestHighLevelClient client = new RestHighLevelClient(builder);
return client;
}
}
2、新建EsKeyWordService类
import java.util.ArrayList;
import java.util.Map;
public interface EsKeyWordService {
ArrayList<Map<String,Object>> findByEsKeyword(String eskeyword);
}
3、新建EsKeyWordServiceImpl类
@Service
public class EsKeyWordServiceImpl implements EsKeyWordService {
RestHighLevelClient restHighLevelClient = EsClient.getClient(); // 连接ES
String index = "keywordlist"; // 索引
String type="tweet"; // 类型
/**
* 根据关键词查询
* @param eskeyword
* @return
*/
@SneakyThrows
@Override
public ArrayList<Map<String,Object>> findByEsKeyword(String eskeyword) {
//1.创建request对象
SearchRequest searchRequest=new SearchRequest(index);
searchRequest.types(type);
//2.指定查询条件
SearchSourceBuilder builder=new SearchSourceBuilder();
//这里使用 kwname.keyword 可解决中文查询为空的问题
builder.query(QueryBuilders.termQuery("kwname.keyword",eskeyword));
//builder.query(QueryBuilders.matchPhraseQuery("kwname",eskeyword));
searchRequest.source(builder);
//执行查询
SearchResponse rsp = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//存放数据
ArrayList<Map<String,Object>> keyWordList = new ArrayList<>();
for (SearchHit hit:rsp.getHits().getHits()) {
keyWordList.add(hit.getSourceAsMap());
}
//返回数据
return keyWordList;
}
}
4、新建EsKeywordController类
@RestController
public class EsKeywordController {
private ResultInfo info;
@Autowired
EsKeyWordService esKeyWordService;
@ModelAttribute
public void init() {
info = new ResultInfo();
}
/**
* 根据关键词查询
* @param keyword
* @return
*/
@GetMapping("/es")
public ResultInfo EsKeywordList(String keyword){
ArrayList<Map<String,Object>> keyWordList = esKeyWordService.findByEsKeyword(keyword);
if (keyWordList != null){
info.setData(keyWordList);
}else {
info.setMsg(Code.NODATA);
}
return info;
}
}
5、测试