ES的java客户端
添加依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.10.2</version>
</dependency>
复制代码
索引管理
-
创建索引
- 创建一个RestHightLevelClient对象,相当于和服务端建立连接
- 使用client的索引管理的对象,indices()返回索引管理对象
-
创建索并设置settings信息
- CreateIndexRequest对象中设置settings即可
-
创建索引应设置mapping信息
{ "properties":{ "id":{ "type":"long" }, "title":{ "type":"text", "analyzer":"ik_smart", "store":true }, "content":{ "type":"text", "analyzer":"ik_smart", "store":true } } } 复制代码
-
删除索引库
- DeleteIndexRequest对象,其中包含索引库的名称即可
- indeces().delete(request);
案例
public class IndexManagerTest {
public RestHighLevelClient client = null;
@Before
public void init() {
//1、和服务端**建立连接**
client = new RestHighLevelClient(RestClient.builder(
new HttpHost("xxx.xxx.xxx.xxx", 9200, "http"),
new HttpHost("xxx.xxx.xxx.xxx", 9200, "http"),
new HttpHost("xxx.xxx.xxx.xxx", 9200, "http")
));
}
@Test
public void createIndex() throws IOException {
//创建名为test的索引库
client.indices().create(new CreateIndexRequest("test"), RequestOptions.DEFAULT);
}
@Test
public void createIndexWithSetting() throws Exception {
//创建名为test1的索引库并设置setting
CreateIndexRequest request = new CreateIndexRequest("test1")
.settings(
Settings.builder()
.put("number_of_shards", 5)
.put("number_of_replicas", 1)
.build()
);
boolean acknowledged = client.indices().create(request, RequestOptions.DEFAULT).isAcknowledged();
System.out.println(acknowledged);
}
@Test
public void putMapping() throws Exception {
String mappingStr = "{\n" +
"\t\"properties\":{\n" +
"\t\t\"id\":{\n" +
"\t\t\t\"type\":\"long\"\n" +
"\t\t},\n" +
"\t\t\"title\":{\n" +
"\t\t\t\"type\":\"text\",\n" +
"\t\t\t\"analyzer\":\"ik_max_word\",\n" +
"\t\t\t\"store\":true\n" +
"\t\t},\n" +
"\t\t\"content\":{\n" +
"\t\t\t\"type\":\"text\",\n" +
"\t\t\t\"analyzer\":\"ik_max_word\",\n" +
"\t\t\t\"store\":true\n" +
"\t\t},\n" +
"\t\t\"comment\":{\n" +
"\t\t\t\"type\":\"text\",\n" +
"\t\t\t\"analyzer\":\"ik_max_word\",\n" +
"\t\t\t\"store\":true\n" +
"\t\t},\n" +
"\t\t\"mobile\":{\n" +
"\t\t\t\"type\":\"keyword\",\n" +
"\t\t\t\"store\":true\n" +
"\t\t}\n" +
"\t}\n" +
"}";
//创建完成之后设置setting
PutMappingRequest request = new PutMappingRequest("test")
.source(mappingStr, XContentType.JSON);
boolean acknowledged = client.indices().putMapping(request, RequestOptions.DEFAULT).isAcknowledged();
System.out.println(acknowledged);
}
@Test
public void createIndexWithMapping() throws Exception {
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.startObject("properties")
.startObject("id")
.field("type", "long")
.endObject()
.startObject("title")
.field("type", "text")
.field("store", true)
.field("analyzer", "ik_max_word")
.endObject()
.startObject("content")
.field("type", "text")
.field("store", true)
.field("analyzer", "ik_max_word")
.endObject()
.startObject("comment")
.field("type", "text")
.field("store", true)
.field("analyzer", "ik_max_word")
.endObject()
.startObject("mobile")
.field("type", "keyword")
.field("store", true)
.endObject()
.endObject()
.endObject();
/*String mappingStr = "{\n" +
"\t\"properties\":{\n" +
"\t\t\"id\":{\n" +
"\t\t\t\"type\":\"long\"\n" +
"\t\t},\n" +
"\t\t\"title\":{\n" +
"\t\t\t\"type\":\"text\",\n" +
"\t\t\t\"analyzer\":\"ik_max_word\",\n" +
"\t\t\t\"store\":true\n" +
"\t\t},\n" +
"\t\t\"content\":{\n" +
"\t\t\t\"type\":\"text\",\n" +
"\t\t\t\"analyzer\":\"ik_max_word\",\n" +
"\t\t\t\"store\":true\n" +
"\t\t},\n" +
"\t\t\"comment\":{\n" +
"\t\t\t\"type\":\"text\",\n" +
"\t\t\t\"analyzer\":\"ik_max_word\",\n" +
"\t\t\t\"store\":true\n" +
"\t\t},\n" +
"\t\t\"mobile\":{\n" +
"\t\t\t\"type\":\"keyword\",\n" +
"\t\t\t\"store\":true\n" +
"\t\t}\n" +
"\t}\n" +
"}";*/
String json = XContentHelper.convertToJson(BytesReference.bytes(builder), true, true, builder.contentType());
System.out.println(json);
//创建索引库test3并设置Setting和Mapping
CreateIndexRequest request = new CreateIndexRequest("test3")
.settings(
Settings.builder()
.put("number_of_shards", 5)
.put("number_of_replicas", 1)
.build()
)
//.mapping(mappingStr, XContentType.JSON);
.mapping(builder);
boolean acknowledged = client.indices().create(request, RequestOptions.DEFAULT).isAcknowledged();
System.out.println(acknowledged);
}
@Test
public void deleteIndex() throws Exception {
//删除test3索引库
client.indices().delete(new DeleteIndexRequest("test3"), RequestOptions.DEFAULT);
}
}
复制代码
文档管理
-
添加文档
- 使用RestHightLevelClient对象
- 使用client对象的index方法添加文档
- 创建IndexRequest对象,其中包含了索引库名称、文档id、文档的内容
-
更新文档
- 使用RestHightLevelClient对象
- 使用client对象的update方法更新文档
- 创建UpdateRequest对象,其中包含了索引库名称、文档id、文档的内容
-
删除文档
- 使用RestHightLevelClient对象
- 使用client对象的delete方法删除文档
- 创建UpdateRequest对象,其中包含了索引库名称、文档id
-
批量操作bulk
- 使用RestHightLevelClient对象
- 使用client对象的bulk方法,其中包含了索引库名称、文档id、文档的内容
- 创建BulkRequest对象,使用add方法添加要批量处理的请求
- IndexRequest
- DeleteRequest
- UpdateRequest
案例
public class DocumentManagerTest {
public RestHighLevelClient client = null;
@Before
public void init() {
client = new RestHighLevelClient(RestClient.builder(
new HttpHost("192.168.68.129", 9200, "http"),
new HttpHost("192.168.68.130", 9200, "http"),
new HttpHost("192.168.68.131", 9200, "http")
));
}
@Test
public void addDocument() throws IOException {
String item = "{\"id\":1, \"title\":\"知名艺人迷之操作让人看呆了..\", \"content\":\"看呆了..\", \"comment\":\"娱乐\", \"mobile\":\"13900112233\"}";
IndexResponse response = client.index(new IndexRequest()
.index("test")
.id("1")
.source(item, XContentType.JSON)
, RequestOptions.DEFAULT);
System.out.println(response);
}
@Test
public void updateDocument() throws Exception {
String item = "{\"id\":1, \"title\":\"bbfdfbf\", \"content\":\"bsgdfbgf\", \"comment\":\"娱乐\", \"mobile\":\"13900112239\"}";
UpdateResponse response = client.update((new UpdateRequest()
.index("test")
.id("1")
.doc(item, XContentType.JSON))
, RequestOptions.DEFAULT);
System.out.println(response);
}
@Test
public void deleteDocument() throws Exception {
DeleteRequest request = new DeleteRequest("test","1");
System.out.println(request);
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
System.out.println(response);
}
@Test
public void bulkDocument() throws IOException {
JSONArray jsonArray = JSONArray.parseArray("自定义一些json字符串数据");
BulkRequest bulkRequest = new BulkRequest();
jsonArray.stream()
.forEach(item -> {
IndexRequest indexRequest = new IndexRequest();
indexRequest.index("test")
.id(((JSONObject) item).getString("id"))
.source(((JSONObject) item).toJSONString(), XContentType.JSON);
bulkRequest.add(indexRequest);
});
client.bulk(bulkRequest, RequestOptions.DEFAULT);
}
@Test
public void getDocumentById() throws Exception {
GetResponse response = client.get(new GetRequest("test", "1"), RequestOptions.DEFAULT);
System.out.println(response);
Map<String, Object> source = response.getSource();
System.out.println(source);
}
}
复制代码
文档搜索
-
步骤
-
创建一个client对象
-
使用client的search方法实现查询操作
-
需要SearchRequest参数
//创建查询条件请求体 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder //查询条件 .query(QueryBuilders.multiMatchQuery("最喜爱的电影","title", "content")) //过滤条件 .postFilter(QueryBuilders.termQuery("title", "开心")) //分页条件 .from(0) .size(10) //高亮条件 .highlighter( new HighlightBuilder() .field("title") .field("content") .preTags("<em>") .postTags("</em>") ); //创建SearchRequest对象 SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("blog1");//request对象中需要有索引的名称 searchRequest.source(searchSourceBuilder);//request对象中需要包含请求体 //执行查询 SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); 复制代码
-
request对象中需要有索引的名称
-
request对象中需要包含请求体(SearchSourceBuilder)
-
请求体中包含查询条件,分页条件、过滤条件、高亮条件等
-
执行查询
-
从查询结果中取数据
-
-
返回结果
-
total().value属性:命中的所有的记录数
-
默认是有分页的,默认是返回前10条记录
-
文档是包含在searchHits数组中
SearchHits hits = searchResponse.getHits(); System.out.println("总记录数:" + hits.getTotalHits().value); SearchHit[] searchHits = hits.getHits(); Stream.of(searchHits) .forEach(e->{ Map<String, HighlightField> highlightFields = e.getHighlightFields();//高亮结果 String source = e.getSourceAsString(); System.out.println(source); System.out.println(highlightFields); }); 复制代码
-
-
查询条件
- 封装到SearchRequest对象中,其中查询条件需要封装到SearchSourceBuilder中
- 查询条件:QueryBuilders工具类创建
- 分页学习:from、size
- 过滤条件:filter实现过滤,过滤条件可以有多个
//创建查询条件请求体 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder //查询条件 .query(QueryBuilders.multiMatchQuery("最喜爱的电影","title", "content")) //过滤条件 .postFilter(QueryBuilders.termQuery("title", "开心")) //分页条件 .from(0) .size(10) //高亮条件 .highlighter( new HighlightBuilder() .field("title") .field("content") .preTags("<em>") .postTags("</em>") ); 复制代码
- 封装到SearchRequest对象中,其中查询条件需要封装到SearchSourceBuilder中