Elasticsearch简单学习

打印 上一主题 下一主题

主题 871|帖子 871|积分 2613

1、依赖的导入

  1. <!--ES依赖-->
  2. <dependency>
  3.     <groupId>org.elasticsearch.client</groupId>
  4.     <artifactId>elasticsearch-rest-high-level-client</artifactId>
  5. </dependency>
复制代码
2、客户端链接

  1. RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://localhost:9200")));
复制代码
3、索引库的相关操作

1、索引库的创建

  1. @Test
  2. void createTestIndex() throws IOException {
  3.     /*创建索引库*/
  4.     //1.创建Request对象,索引库名称必须为小写字母
  5.     CreateIndexRequest request = new CreateIndexRequest("test_index");
  6.     String source = "{\n" +
  7.         "        "mappings":{\n" +
  8.         "        "properties":{\n" +
  9.         "            "id":{\n" +
  10.         "                "type":"integer"\n" +
  11.         "            },\n" +
  12.         "            "name":{\n" +
  13.         "                "type":"text",\n" +
  14.         "                "analyzer":"ik_max_word"\n" +
  15.         "            },\n" +
  16.         "            "age":{\n" +
  17.         "                "type":"integer"\n" +
  18.         "            },\n" +
  19.         "            "sex":{\n" +
  20.         "                "type":"keyword"\n" +
  21.         "            },\n" +
  22.         "            "bossId":{\n" +
  23.         "                "type":"integer"\n" +
  24.         "            },\n" +
  25.         "            "departmentId":{\n" +
  26.         "                "type":"integer"\n" +
  27.         "            }\n" +
  28.         "        }\n" +
  29.         "    }\n" +
  30.         "}";
  31.     //2.准备请求的参数:DSL语句
  32.     request.source(source, XContentType.JSON);
  33.     //3.发请求
  34.     client.indices().create(request, RequestOptions.DEFAULT);
  35. }
复制代码
2、判定索引库是否存在

  1. @Test
  2. void existsTestIndex() throws IOException {
  3.     /*判断索引库是否存在*/
  4.     //1.创建Request对象,名称必须为小写字母
  5.     GetIndexRequest request = new GetIndexRequest("test_index");
  6.     //2.发请求
  7.     boolean is = client.indices().exists(request, RequestOptions.DEFAULT);
  8.     System.out.println(is);
  9. }
复制代码
3、删除索引库

  1. @Test
  2. void deleteTestIndex() throws IOException {
  3.     /*删除索引库*/
  4.     //1.创建Request对象,名称必须为小写字母
  5.     DeleteIndexRequest request = new DeleteIndexRequest("test_index");
  6.     //2.发请求
  7.     client.indices().delete(request, RequestOptions.DEFAULT);
  8. }
复制代码
4、文档的操作

1、创建文档

  1. @Test
  2. void createDocTest() throws IOException {
  3.     //从数据库中获取数据对象
  4.     Employee employee = employeeMapper.selectAllById(1);
  5.     //1. 创建Request对象
  6.     IndexRequest request = new IndexRequest("test_index").id(employee.getId().toString());
  7.     //2.准备json文档
  8.     String source = JSON.toJSONString(employee);
  9.     //2.1准备json文档
  10.     request.source(source, XContentType.JSON);
  11.     //3.发请求
  12.     client.index(request, RequestOptions.DEFAULT);
  13. }
复制代码
2、获取指定的文档

  1. @Test
  2. void getDocTest() throws IOException {
  3.     //1.创建Request对象
  4.     GetRequest request = new GetRequest("test_index","1");
  5.     //2.发请求,得到结果
  6.     GetResponse response = client.get(request, RequestOptions.DEFAULT);
  7.     //3.解析结果
  8.     String json = response.getSourceAsString();
  9.     System.out.println(json);
  10.     Employee employee = JSON.parseObject(json, Employee.class);
  11.     System.out.println(employee);
  12. }
复制代码
3、更新文档

  1. @Test
  2. void updateDocTest() throws IOException {
  3.     //1.创建Request对象
  4.     UpdateRequest request = new UpdateRequest("test_index","1");
  5.     //2.准备DSL语句
  6.     request.doc(
  7.         "age",18
  8.     );
  9.     //3.发请求
  10.     client.update(request,RequestOptions.DEFAULT);
  11. }
复制代码
4、删除文档

  1. @Test
  2. void deleteDocTest() throws IOException {
  3.     //1.创建Request对象
  4.     DeleteRequest request = new DeleteRequest("test_index","1");
  5.     //2.发请求
  6.     client.delete(request,RequestOptions.DEFAULT);
  7. }
复制代码
5、批量操作(创建)

  1. @Test
  2. void batchCreateDocTest() throws IOException {
  3.     //1.创建Request对象
  4.     BulkRequest request = new BulkRequest();
  5.     //2.准备DSL语句,批量增加文档
  6.     List<Employee> employees = employeeMapper.selectAll();
  7.     for(Employee e : employees){
  8.         request.add(new IndexRequest("test_index")
  9.                     .id(e.getId().toString())
  10.                     .source(JSON.toJSONString(e),XContentType.JSON));
  11.     }
  12.     //3.发请求
  13.     client.bulk(request,RequestOptions.DEFAULT);
  14. }
复制代码
5、搜索文档

1、分词查询-查询全部

  1. @Test
  2. void matchAllTest() throws IOException {  //分词查询
  3.     //1.准备Request
  4.     SearchRequest request = new SearchRequest("test_index");
  5.     //2.组织DSL参数
  6.     request.source() // 查询全部
  7.         .query(QueryBuilders.matchAllQuery());
  8.     //3.发送请求
  9.     SearchResponse response = client.search(request,RequestOptions.DEFAULT);
  10.     //4.解析结果
  11.     SearchHits searchHits = response.getHits();
  12.     //4.1获取总条数
  13.     long total = searchHits.getTotalHits().value;
  14.     System.out.println("总共有:" + total + "条数据");
  15.     //4.2获取文档数组
  16.     SearchHit[] hits = searchHits.getHits();
  17.     //4.3遍历数组
  18.     for(SearchHit h : hits){
  19.         String json = h.getSourceAsString();
  20.         Employee employee = JSON.parseObject(json, Employee.class);
  21.         System.out.println(employee);
  22.     }
  23. }
复制代码
2、分词查询-指定字段

  1. @Test
  2. void matchQueryTest() throws IOException { //分词查询
  3.     //1.准备Request
  4.     SearchRequest request = new SearchRequest("test_index");
  5.     //2.组织DSL参数
  6.     request.source() //查询指定字段的值,也可以指定多个字段 .multiMatchQuery()
  7.         .query(QueryBuilders.matchQuery("name","晨"));
  8.     //3.发送请求
  9.     SearchResponse response = client.search(request,RequestOptions.DEFAULT);
  10.     //4.解析结果
  11.     SearchHits searchHits = response.getHits();
  12.     //4.1获取总条数
  13.     long total = searchHits.getTotalHits().value;
  14.     System.out.println("总共有:" + total + "条数据");
  15.     //4.2获取文档数组
  16.     SearchHit[] hits = searchHits.getHits();
  17.     //4.3遍历数组
  18.     for(SearchHit h : hits){
  19.         String json = h.getSourceAsString();
  20.         Employee employee = JSON.parseObject(json, Employee.class);
  21.         System.out.println(employee);
  22.     }
  23. }
复制代码
3、精确查询

  1. @Test
  2. void termQueryTest() throws IOException {  //精确查询
  3.     //1.准备Request
  4.     SearchRequest request = new SearchRequest("test_index");
  5.     //2.组织DSL参数
  6.     request.source() //精确查询只能查询 非text(分词字段),如果查询分词字段,则自动采用模糊分词查询
  7.         .query(QueryBuilders.termQuery("age","33"));
  8.     //3.发送请求
  9.     SearchResponse response = client.search(request,RequestOptions.DEFAULT);
  10.     //4.解析结果
  11.     SearchHits searchHits = response.getHits();
  12.     //4.1获取总条数
  13.     long total = searchHits.getTotalHits().value;
  14.     System.out.println("总共有:" + total + "条数据");
  15.     //4.2获取文档数组
  16.     SearchHit[] hits = searchHits.getHits();
  17.     //4.3遍历数组
  18.     for(SearchHit h : hits){
  19.         String json = h.getSourceAsString();
  20.         Employee employee = JSON.parseObject(json, Employee.class);
  21.         System.out.println(employee);
  22.     }
  23. }
复制代码
4、范围查询

  1. @Test
  2. void rangeQueryTest() throws IOException {  //范围查询
  3.     //1.准备Request
  4.     SearchRequest request = new SearchRequest("test_index");
  5.     //2.组织DSL参数
  6.     request.source() //范围查询,gte:大于等于,lte:小于等于,gt:大于,lt:小于
  7.         .query(QueryBuilders.rangeQuery("age").gte(30).lte(35));
  8.     //3.发送请求
  9.     SearchResponse response = client.search(request,RequestOptions.DEFAULT);
  10.     //4.解析结果
  11.     SearchHits searchHits = response.getHits();
  12.     //4.1获取总条数
  13.     long total = searchHits.getTotalHits().value;
  14.     System.out.println("总共有:" + total + "条数据");
  15.     //4.2获取文档数组
  16.     SearchHit[] hits = searchHits.getHits();
  17.     //4.3遍历数组
  18.     for(SearchHit h : hits){
  19.         String json = h.getSourceAsString();
  20.         Employee employee = JSON.parseObject(json, Employee.class);
  21.         System.out.println(employee);
  22.     }
  23. }
复制代码
5、复合查询

  1. @Test
  2. void boolQueryTest() throws IOException {  //复合查询
  3.     //1.准备Request
  4.     SearchRequest request = new SearchRequest("test_index");
  5.     //2.1创建复合查询对象
  6.     BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
  7.     //2.2添加查询条件
  8.     boolQuery.must(QueryBuilders.matchQuery("name","雨"));
  9.     boolQuery.filter(QueryBuilders.rangeQuery("age").gte(20).lte(35));
  10.     //2.3组织DSL参数
  11.     request.source()
  12.         .query(boolQuery);
  13.     //3.发送请求
  14.     SearchResponse response = client.search(request,RequestOptions.DEFAULT);
  15.     //4.解析结果
  16.     SearchHits searchHits = response.getHits();
  17.     //4.1获取总条数
  18.     long total = searchHits.getTotalHits().value;
  19.     System.out.println("总共有:" + total + "条数据");
  20.     //4.2获取文档数组
  21.     SearchHit[] hits = searchHits.getHits();
  22.     //4.3遍历数组
  23.     for(SearchHit h : hits){
  24.         String json = h.getSourceAsString();
  25.         Employee employee = JSON.parseObject(json, Employee.class);
  26.         System.out.println(employee);
  27.     }
  28. }
复制代码
6、分页排序查询

  1. @Test
  2. void pageSortQueryTest() throws IOException {  //分页、排序查询
  3.     // 页码,每页大小
  4.     int page = 3,size = 10;
  5.     //1.准备Request
  6.     SearchRequest request = new SearchRequest("test_index");
  7.     //2组织DSL参数
  8.     request.source()
  9.         .from((page-1)*size) // 包含form,(page-1)*size,是前端传过来的页码和每页条数
  10.         .size(size)
  11.         .sort("id", SortOrder.ASC)
  12.         .query(QueryBuilders.matchAllQuery());
  13.     //3.发送请求
  14.     SearchResponse response = client.search(request,RequestOptions.DEFAULT);
  15.     //4.解析结果
  16.     SearchHits searchHits = response.getHits();
  17.     //4.1获取总条数
  18.     long total = searchHits.getTotalHits().value;
  19.     System.out.println("总共有:" + total + "条数据");
  20.     //4.2获取文档数组
  21.     SearchHit[] hits = searchHits.getHits();
  22.     //4.3遍历数组
  23.     for(SearchHit h : hits){
  24.         String json = h.getSourceAsString();
  25.         Employee employee = JSON.parseObject(json, Employee.class);
  26.         System.out.println(employee);
  27.     }
  28. }
复制代码
6、高亮查询

  1. @Test
  2. void highLightQueryTest() throws IOException {  //高亮查询
  3.     //1.准备Request
  4.     SearchRequest request = new SearchRequest("test_index");
  5.     //2组织DSL参数
  6.     request.source()
  7.         .highlighter(new HighlightBuilder() //高亮显示
  8.                      .field("name") //字段名
  9.                      .requireFieldMatch(false) // 是否与查询字段匹配
  10.                     ) // 用的默认标签 <em></em>
  11.         .query(QueryBuilders.matchQuery("name","晨"));
  12.     //3.发送请求
  13.     SearchResponse response = client.search(request,RequestOptions.DEFAULT);
  14.     //4.解析结果
  15.     SearchHits searchHits = response.getHits();
  16.     //4.1获取总条数
  17.     long total = searchHits.getTotalHits().value;
  18.     System.out.println("总共有:" + total + "条数据");
  19.     //4.2获取文档数组
  20.     SearchHit[] hits = searchHits.getHits();
  21.     //4.3遍历数组
  22.     for(SearchHit h : hits){
  23.         String json = h.getSourceAsString();
  24.         Employee employee = JSON.parseObject(json, Employee.class);
  25.         // 高亮显示,因为每条数据都是带有 晨 的,所以每条数据都有一个HighlightField用于替换
  26.         HighlightField name = h.getHighlightFields().get("name");
  27.         //替换
  28.         employee.setName(name.getFragments()[0].toString());
  29.         System.out.println(employee);
  30.     }
  31. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

光之使者

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表