导包
<!-- fastjson 对象和json转换 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version> </dependency> <!--es 高级版本操作坐标--> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>6.8.3</version> </dependency> <!--es依赖--> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>6.8.3</version> </dependency>
先准备一份数据库和表
PUT /root02 { "mappings": { "product": { "properties": { "id": { "type": "keyword" }, "title": { "type": "text", "analyzer": "ik_max_word" }, "category": { "type": "keyword" }, "brand": { "type": "keyword" }, "images": { "type": "keyword", "index": false }, "price": { "type": "double" } } } } }
创建一个对应的实体类
@Data @AllArgsConstructor @NoArgsConstructor public class Product { private Long id; /** * 标题 */ private String title; /** * 分类 */ private String category; /** * 品牌 */ private String brand; /** * 价格 */ private Double price; /** * 图片地址 */ private String images; }
这里的案例使用测试类进行
1.增删改和简单查
API
java连接至es
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("x.x.x.x", 9200, "http")));
增删改和简单查
//新增 IndexRequest indexRequest = new IndexRequest("root02", "product", "1"); //根据id查询 GetRequest getRequest = new GetRequest("root02", "product", "1"); //修改数据 final UpdateRequest updateRequest = new UpdateRequest("root02", "product", "1"); //删除根据id DeleteRequest deleteRequest = new DeleteRequest("root02", "product", "1"); //批量添加 BulkRequest bulkRequest = new BulkRequest();
使用
public class TestClass { RestHighLevelClient client; @BeforeEach public void before() { client = new RestHighLevelClient( RestClient.builder( new HttpHost("62.234.118.219", 9902, "http"))); } /* 文档新增 */ @Test public void add() throws IOException { //1.创建请求对象 /* 第一个参数: 索引库名称 第二个参数: 类型名称 第三个参数: 可选项,id */ IndexRequest indexRequest = new IndexRequest("root02", "product", "1"); //2.准备数据---》json Product product = new Product(1L, "小米手机", "手机", "小米", 2699.00, "http://www.baidu.com"); String jsonString = JSON.toJSONString(product); //3.将数据封装到请求对象 indexRequest.source(jsonString, XContentType.JSON); //4.发送请求 IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT); //5.打印结果 System.out.println("结果: " + indexResponse); } /* 根据id查询文档 */ @Test public void getById() throws IOException { //1.创建查询对象并且设置查询id GetRequest getRequest = new GetRequest("root02", "product", "1"); //2.发送请求 final GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT); System.out.println(documentFields); } /* 修改文档 */ @Test public void updateDocById() throws IOException { final UpdateRequest updateRequest = new UpdateRequest("root02", "product", "1"); //2.组装修改内容---》json Product product = new Product(1L, "大米手机", "手机", "大米", 19999.00, "http://www.baidu.com"); String jsonString = JSON.toJSONString(product); //3.将修改内容封装到修改对象 updateRequest.doc(jsonString, XContentType.JSON); final UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT); System.out.println(update); } //删除文档 @Test public void delById() throws IOException { //1.创建删除对象 DeleteRequest deleteRequest = new DeleteRequest("root02", "product", "1"); //2.发送请求 DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT); System.out.println("结果: " + deleteResponse); } /* 批量新增 */ @Test public void batchAddDoc() throws IOException { //1.创建批量请求对象 BulkRequest bulkRequest = new BulkRequest(); //2.for循环创建对象----》IndexRequest---》json for (long i = 2; i < 10; i++) { IndexRequest indexRequest = new IndexRequest("root02", "product", i + ""); //2.准备数据---》json Product product = new Product(i, "小米手机" + i, "手机", "小米", 2699.00 + i, "http://www.baidu.com"); String jsonString = JSON.toJSONString(product); //3.将数据封装到请求对象 indexRequest.source(jsonString, XContentType.JSON); //4.将IndexRequest封装到批量请求对象 bulkRequest.add(indexRequest); } //4.发送请求 BulkResponse bulkResponse = null; bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT); System.out.println("结果: " + bulkResponse); } @AfterEach public void close() throws IOException { client.close(); } }
2.复杂查询
//创建searchRequest请求对象
RestHighLevelClient client;
//创建searchRequest请求对象
SearchRequest searchRequest = new SearchRequest("root02");
//创建searchSourceBuilder对象--》封装查询对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
核心对象
QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
//封装了各种查询方法
对象关系
SearchRequest -->封装 SearchSourceBuilder -->封装 QueryBuilder
RestHighLevelClient --> 携带封装好的 SearchRequest 发送请求
使用
public class Test02 { RestHighLevelClient client; //1.创建searchRequest请求对象 SearchRequest searchRequest = new SearchRequest("root02"); //2.创建searchSourceBuilder对象-->封装查询对象 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); @BeforeEach public void before() { client = new RestHighLevelClient( RestClient.builder( new HttpHost("62.234.118.219", 9902, "http"))); } /* 查询所有 */ @Test public void matchAll() throws IOException { //创建查询对象QueryBuilder QueryBuilder queryBuilder = QueryBuilders.matchAllQuery(); //封装查询对象 searchSourceBuilder.query(queryBuilder); //searchSourceBuilder封装到searchRequest对象中 searchRequest.source(searchSourceBuilder); showContext(); } /* 模糊匹配查询 */ @Test public void matchDoc() throws IOException { //3.创建查询对象 QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "小米"); searchSourceBuilder.query(queryBuilder); searchRequest.source(searchSourceBuilder); //发送请求 showContext(); } /* 精确查询,一般用于查询不分词字段 */ @Test public void term() throws IOException { QueryBuilder queryBuilder = QueryBuilders.termQuery("price", 2706); searchSourceBuilder.query(queryBuilder); searchRequest.source(searchSourceBuilder); showContext(); } //排序,高亮,分页查询 @Test public void commons() throws IOException { QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "小米"); searchSourceBuilder.query(queryBuilder); /* 排序 //默认升序排序 分页: size: 页大小 from: 起始索引位置 int start = (pagenum -1) * pagesize_ 高亮:设置条件 前置标签: 后置标签: 高亮字段: */ HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.preTags("<span color='red'>"); highlightBuilder.postTags("</span>"); highlightBuilder.field("title"); searchSourceBuilder.sort("price", SortOrder.ASC).from(4).size(2).highlighter(highlightBuilder); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); //7.解析结果 SearchHits searchHits = searchResponse.getHits(); if (null != searchHits) { SearchHit[] hits = searchHits.getHits(); for (SearchHit hit : hits) { String sourceAsString = hit.getSourceAsString(); System.out.println("查询结果:" + sourceAsString); /* 高亮结果解析 */ Map<String, HighlightField> highlightFields = hit.getHighlightFields(); if (!highlightFields.isEmpty()) { Text title = highlightFields.get("title").getFragments()[0]; System.out.println("高亮结果: " + title); } } } } //封装请求和打印数据 public void showContext() throws IOException { //发送请求 SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); //解析结果 SearchHits searchHits = searchResponse.getHits(); if (null != searchHits) { SearchHit[] hits = searchHits.getHits(); for (SearchHit hit : hits) { String sourceAsString = hit.getSourceAsString(); System.out.println("查询结果:" + sourceAsString); } } } @AfterEach public void close() throws IOException { client.close(); } }