栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

初学ES(三)

初学ES(三)

ES的JavaAPI(高级客户端)

基于SringBoot2.2.2

导入依赖


    
    
        org.springframework.boot
        spring-boot-starter
    
	
    
        org.springframework.boot
        spring-boot-starter-test
        test
    

    
    
        org.elasticsearch.client
        elasticsearch-rest-high-level-client
        7.4.0
    
    
    
        org.elasticsearch.client
        elasticsearch-rest-client
        7.4.0
    
    	
    
        org.elasticsearch
        elasticsearch
        7.4.0
    
	
    
        com.alibaba
        fastjson
        1.2.4
    

    

创建配置类

package com.nkym.es.config;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;

@SpringBootConfiguration //配置类
public class ElasticSearchConfig {
    @Value("${es.host}") //Spring注解 从yml,properties文件中注入值
    private String host; //ES主机域名
    @Value("${es.port}")
    private int port;//ES端口号。默认9200.

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public ElasticSearchConfig(String host, int port) {
        this.host = host;
        this.port = port;
    }

    public ElasticSearchConfig() {
    }
    //创建RestHighLevelClient客户端,连接ES。
    @Bean
    public RestHighLevelClient getRest(){
      return  new RestHighLevelClient(RestClient.builder(new HttpHost(this.host,this.port)));
    }
}

前置工作做完了 我们开始测试。

创建测试类。

@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;
}
索引API 创建索引

隐式映射的Index

@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    //连接ES的api 类似于jdbc
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Test
    public void test() throws IOException {
        //创建索引请求    //参数:索引名(必须小写)
    CreateIndexRequest indexRequest = new CreateIndexRequest("indexname");
    CreateIndexResponse response =    //在高级 REST 客户端中解析 REST 响应  参数1:创建索引的请求 参数2:固定值RequestOptions.DEFAULT
        restHighLevelClient.indices().create(indexRequest,RequestOptions.DEFAULT); 
        //打印创建成功后的信息。
        System.out.println(response.isAcknowledged());
        System.out.println(response.isShardsAcknowledged());
    }
}

显式映射的Index

@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Test
    public void test() throws IOException {
    CreateIndexRequest indexRequest = new CreateIndexRequest("indexname");
        indexRequest.mapping( //定义映射
                "{n" +
                        "  "properties": {n" +
                        "    "message": {n" +
                        "      "type": "text"n" +
                        "    }n" +
                        "  }n" +
                        "}", XContentType.JSON); //这个映射以Json字符串形式提供
    CreateIndexResponse response = restHighLevelClient.indices().create(indexRequest,RequestOptions.DEFAULT);
        System.out.println(response.isAcknowledged());
        System.out.println(response.isShardsAcknowledged());
    }
}
删除索引
@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;
    
    @Test
    public void test22() throws IOException {
        //创建删除索引请求    参数:要删除的索引名字
        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("indexname");
        //调用高级Rest客户端响应请求。
        AcknowledgedResponse delete = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
        //打印响应结果。
        System.out.println(delete.isAcknowledged());

    }
}

判断索引是否存在

@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Test
    public void test22() throws IOException {
        //创建GETindex请求,     参数(可变形参可以填多个):要判断的索引名字
        GetIndexRequest request = new GetIndexRequest("indexname","person");
        //响应是一个boolean值,索引(或多个索引)是否存在。
        boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
        //只有所有的index存在时才会返回ture有一个不存在都会返回false
        System.out.println(exists);

    }
}
添加映射(类似于Mysql增加字段)
@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Test
    public void test22() throws IOException {
        //创建增加Mapping请求
       PutMappingRequest request = new PutMappingRequest("indexname");
        request.source(//按照原生ES增加映射格式写 String语句
                "{n" +
                        "  "properties": {n" +
                        "    "name": {n" +
                        "      "type": "text"n" +
                        "    }n" +
                        "  }n" +
                        "}",
                XContentType.JSON);
        //Rest高级客户端响应请求,返回请求结果。
        AcknowledgedResponse response = restHighLevelClient.indices().putMapping(request, RequestOptions.DEFAULT);
        System.out.println(response);
    }
}
获取映射(类似MYSQL获取表结构)
@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Test
    public void test22() throws IOException {
        //创建获取映射的请求
       GetMappingsRequest request = new GetMappingsRequest();
	//获取那个索引的映射,若不设置默认获取所有索引的映射
       request.indices("indexname");
		//rest高级客户端响应请求
        GetMappingsResponse mapping = restHighLevelClient.indices().getMapping(request, RequestOptions.DEFAULT);
		//遍历响应结果的映射。
  		//如果上方request请求没有设置索引名,可以用这个语句获取指定索引的mapping, mapping.mappings().get("");
        for (MappingmetaData value : mapping.mappings().values()) {
            System.out.println(value.getSourceAsMap());
        }
    }
}

执行上面操作返回结果和postMan响应结果一致。

获取某一字段的映射
@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Test
    public void test22() throws IOException {
        //创建获取字段映射请求。
       GetFieldMappingsRequest request = new GetFieldMappingsRequest();
        //指定索引库名字
       request.indices("indexname");
        //指定字段名,可以有多个
       request.fields("message");
        //Rest客户端响应请求
       GetFieldMappingsResponse mapping = restHighLevelClient.indices().getFieldMapping(request, RequestOptions.DEFAULT);
       	 //指定获取字段映射。
        System.out.println(mapping.mappings().get("indexname").get("field").sourceAsMap());
    }
文档API 创建文档
@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;
	
    //方式一:Map方式
    @Test
    public void test() throws IOException {
        //创建索引请求
        IndexRequest request = new IndexRequest("indexname");
        //创建Map数据源,在Map中放入要存入文档中的数据
        Map map = new HashMap<>();
        map.put("message","123");//字段要对应你指定索引库中有的字段
        map.put("name","linas");
        //将map数据源放入request请求中
 // IndexRequest source = request.id("1").source(map);  生成文档ID可以不用指定,会随机生成。不指定就是下面那个语句
        IndexRequest source = request.source(map);
        //rest客户端响应请求。
        IndexResponse index = restHighLevelClient.index(source, RequestOptions.DEFAULT);
        System.out.println(index.toString());
    }
    
    
    
    //方式二: 	JSon字符串形式
     @Test
    public void test() throws IOException {
        IndexRequest request = new IndexRequest("indexname");
        String jsonString = "{" +
                ""name":"kimchy"," +
                ""message":"trying out Elasticsearch"" +
                "}";
        IndexRequest source = request.id("1").source(jsonString,XContentType.JSON);
        IndexResponse index = restHighLevelClient.index(source, RequestOptions.DEFAULT);
        System.out.println(index.toString());
    }

}
获取文档
@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Test
    public void test() throws IOException {
        //创建获取文档请求  参数1:索引名字,参数2:文档ID
        GetRequest request = new GetRequest("indexname","1");
        //Rest客户端响应
        GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
        //以String形式检索文档
        System.out.println(response.getSourceAsString());
		//以字节形式检索文档byte[]
        System.out.println(new String(response.getSourceAsBytes()));
        //将文档检索为Map
        System.out.println(response.getSourceAsMap());
    }
}

执行结果

判断文档是否存在
@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;
//判断单个文档
    @Test
    public void test() throws IOException {
        //创建获取请求
        GetRequest request = new GetRequest("indexname","1");
        //Rest客户端响应请求返回Boolean,有为true,没有为false
        boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
        System.out.println(exists);
    }
    //判断多个文档
     @Test
    public void test() throws IOException {
    	GetRequest request  = new GetRequest();
    	request.id("1").id("1").index("indexname");
        boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
        System.out.println("exists = " + exists);
    }
}
删除文档
@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    
    @Test
    public void tes2t() throws IOException {
        //创建删除请求
        DeleteRequest request = new DeleteRequest("indexname","2");
        //Rest客户端响应请求
        DeleteResponse delete = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
    }
 }
修改文档
@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;


    @Test
    public void tes2t() throws IOException {
        //创建更新请求
        UpdateRequest request = new UpdateRequest();
        //创建Map 放入数据
        Map map = new HashMap<>();
        map.put("message","hello");
        map.put("name","linas");
        //设置索引名,和要修改数据的文档ID,放入数据
        request.id("1").index("indexname").doc(map);
        //Rest客户端响应请求。
        restHighLevelClient.update(request,RequestOptions.DEFAULT);
    }
  }
批量操作

相当于把多个文档操作放入批量操作API中。

@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;


    @Test
    public void tes2t() throws IOException {
        //创建批处理请求
        BulkRequest request = new BulkRequest();
        //创建放入的数据
        Map map = new HashMap<>();
        map.put("name","linasss");
        map.put("message","hello ,world");
        //创建文档请求
        IndexRequest index = new IndexRequest("indexname");
        index.id("3").source(map);
        //删除文档请求
        DeleteRequest deleteRequest = new DeleteRequest("indexname","1");
        //更新文档请求
        UpdateRequest updateRequest = new UpdateRequest();
        updateRequest.id("1").index("indexname").doc(map);
        //将三个请求加入 批处理请求中
        request.add(index).add(updateRequest).add(deleteRequest);
        //Rest客户端响应批处理请求
        BulkResponse bulk = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
        System.out.println(bulk.getTook());
    }
}    
搜索API

SearchRequest 用于与搜索文档、聚合、建议相关的任何操作,还提供了请求在生成的文档上突出显示的方法。

MatchAll Query

使用规则和原生API相同

@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;


    @Test
    public void tes2t() throws IOException {
        //创建 SeachRequest。如果没有参数,这将针对所有索引运行。     参数:索引名
        SearchRequest request = new SearchRequest("indexname");
        //搜索请求元数据构建
        SearchSourceBuilder builder = new SearchSourceBuilder();
        //指定查询的类型
        builder.query(QueryBuilders.matchAllQuery());
        //数据放入搜索请求中
        request.source(builder);
        //rest客户端响应请求。
        SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        //打印命中数.
        System.out.println(Arrays.toString(search.getHits().getHits()));
    }
}
Match Query

使用规则和原生API相同

@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;


    @Test
    public void tes2t() throws IOException {
          //创建 SeachRequest。如果没有参数,这将针对所有索引运行。     参数:索引名
        SearchRequest request = new SearchRequest("zwh");
         // 构建搜索请求元数据
        SearchSourceBuilder builder = new SearchSourceBuilder();
         //指定查询的类型 后面可以指定分词器等配置。 参数1:字段名,参数2:匹配内容
        builder.query(QueryBuilders.matchQuery("name","zwh1").analyzer("ik_max_word"));
         //数据放入搜索请求中
        request.source(builder);
        //rest客户端响应请求。
        SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        //打印命中数.
        System.out.println(Arrays.toString(search.getHits().getHits()));
    }
}
Term Query

使用规则和原生API相同

@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;


    @Test
    public void tes2t() throws IOException {
          //创建 SeachRequest。如果没有参数,这将针对所有索引运行。     参数:索引名
        SearchRequest request = new SearchRequest("zwh");
          // 构建搜索请求元数据
        SearchSourceBuilder builder = new SearchSourceBuilder();
         //指定查询的类型  参数1:字段名,参数2:匹配内容
        builder.query(QueryBuilders.termQuery("name","zwh2"));
         //数据放入搜索请求中
        request.source(builder);
         //rest客户端响应请求。
        SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
         //打印命中数.
        System.out.println(Arrays.toString(search.getHits().getHits()));
    }
}
分页查询
@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;
    @Test
    public void tes2t() throws IOException {
         //创建 SeachRequest。如果没有参数,这将针对所有索引运行。     参数:索引名
        SearchRequest request = new SearchRequest("zwh");
         // 构建搜索请求元数据
        SearchSourceBuilder builder = new SearchSourceBuilder();
         //指定查询的类型  参数1:字段名,参数2:匹配内容
        builder.query(QueryBuilders.matchQuery("name","zwh1"));
        //对内容进行分页,from:代表从指定页的下一页开始,比如指定0则是从1开始。
        //size:每次查询展示个数
        builder.from(0);
        builder.size(2);
        request.source(builder);
        SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        System.out.println("总命中数" + search.getHits().getTotalHits());
        System.out.println(Arrays.toString(search.getHits().getHits()));
    }
}

执行查询结果 总命中3,只显示两个。

Range Query

@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Test
    public void tes2t() throws IOException {
           //创建 SeachRequest。如果没有参数,这将针对所有索引运行。     参数:索引名
        SearchRequest request = new SearchRequest("zwh");
         // 构建搜索请求元数据
        SearchSourceBuilder builder = new SearchSourceBuilder();
        //指定范围查询  参数1:字段名。lt:小于,gt:小于。
        builder.query(QueryBuilders.rangeQuery("age").lt("30").gt("21"));
            //数据放入搜索请求中
        request.source(builder);
          //rest客户端响应请求。
        SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        System.out.println("总命中数" + search.getHits().getTotalHits());
        System.out.println(Arrays.toString(search.getHits().getHits()));
    }
}
QueyrString Query

类似于Mysql模糊查询官方文档原生APIhttps://www.elastic.co/guide/en/elasticsearch/reference/6.0/query-dsl-query-string-query.html#query-dsl-query-string-query

@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;


    @Test
    public void tes2t() throws IOException {
          //创建 SeachRequest。如果没有参数,这将针对所有索引运行。     参数:索引名
        SearchRequest request = new SearchRequest("zwh");
        // 构建搜索请求元数据
        SearchSourceBuilder builder = new SearchSourceBuilder();
        //  //指定QueryString查询 参数:查询内容,可以使用通配符*  field:字段名,可以使用fields指定多个字段
        builder.query(QueryBuilders.queryStringQuery("z*").field("name").);
          //数据放入搜索请求中
        request.source(builder);
           //rest客户端响应请求。
        SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        System.out.println("总命中数" + search.getHits().getTotalHits());
        System.out.println(Arrays.toString(search.getHits().getHits()));
    }
}
BoolQuery
@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;


    @Test
    public void tes2t() throws IOException {
          //创建 SeachRequest。如果没有参数,这将针对所有索引运行。     参数:索引名
        SearchRequest request = new SearchRequest("zwh");
         // 构建搜索请求元数据
        SearchSourceBuilder builder = new SearchSourceBuilder();
       //创建BoolQueryBuilder
        BoolQueryBuilder queryBuilder = new BoolQueryBuilder();
        //给must传值
        queryBuilder.must(QueryBuilders.rangeQuery("age").gt(1));
        //给filter传值
        queryBuilder.filter(QueryBuilders.matchQuery("name","zwh"));
          //数据放入搜索请求中
        SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
         //rest客户端响应请求。
        System.out.println("总命中数" + search.getHits().getTotalHits());
        System.out.println(Arrays.toString(search.getHits().getHits()));
    }
}
高亮查询

高亮查询要配合其他查询使用。

@RunWith(SpringRunner.class)
@SpringBootTest
public class ESTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;


    @Test
    public void tes2t() throws IOException {
            //创建 SeachRequest。如果没有参数,这将针对所有索引运行。     参数:索引名
        SearchRequest request = new SearchRequest("zwh");
          // 构建搜索请求元数据
        SearchSourceBuilder builder = new SearchSourceBuilder();
        //指定MatchQuery查询
        builder.query(QueryBuilders.matchQuery("name","zwh1"));
        //创建高亮查询
        HighlightBuilder high = new HighlightBuilder().field("name");
        //设置高亮查询
        builder.highlighter(high);
        request.source(builder);
        SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        System.out.println("总命中数" + search.getHits().getTotalHits());
        System.out.println(Arrays.toString(search.getHits().getHits()));
    }
}

查询结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/735286.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号