java使用elasticsearch-rest-high-level-client操作ElesticSearch(创建索引增删改查、文档增删改查、查询方式)

妖狐艹你老母 2023-02-10 05:22 55阅读 0赞

1、搭建spring boot 项目,pom.xml引入依赖如下:

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.0.1.RELEASE</version>
  5. <relativePath/> <!-- lookup parent from repository -->
  6. </parent>
  7. <properties>
  8. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  9. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  10. <java.version>1.8</java.version>
  11. </properties>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.mybatis.spring.boot</groupId>
  15. <artifactId>mybatis-spring-boot-starter</artifactId>
  16. <version>1.3.2</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>mysql</groupId>
  20. <artifactId>mysql-connector-java</artifactId>
  21. <scope>runtime</scope>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-test</artifactId>
  26. <scope>test</scope>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.elasticsearch</groupId>
  30. <artifactId>elasticsearch</artifactId>
  31. <version>6.2.1</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.elasticsearch.client</groupId>
  35. <artifactId>elasticsearch-rest-high-level-client</artifactId>
  36. <version>6.2.1</version>
  37. </dependency>
  38. <dependency>
  39. <groupId>junit</groupId>
  40. <artifactId>junit</artifactId>
  41. <version>4.12</version>
  42. </dependency>
  43. <dependency>
  44. <groupId>com.alibaba</groupId>
  45. <artifactId>fastjson</artifactId>
  46. <version>1.2.44</version>
  47. </dependency>
  48. </dependencies>

2、编写测试代码进行ElesticSearch操作

创建:RestHighLevelClient

  1. @Before
  2. public void prepare() {
  3. // 创建Client连接对象
  4. //String[] ips = {"127.0.0.1:9200"};
  5. String[] ips = {"47.104.193.89:9200", "47.104.180.62:9200"};
  6. HttpHost[] httpHosts = new HttpHost[ips.length];
  7. for (int i = 0; i < ips.length; i++) {
  8. httpHosts[i] = HttpHost.create( ips[i] );
  9. }
  10. RestClientBuilder builder = RestClient.builder( httpHosts );
  11. client = new RestHighLevelClient( builder );
  12. }

2.1 创建索引和映射

  1. /**
  2. * 创建索引 和 映射
  3. *
  4. * @throws IOException
  5. */
  6. @Test
  7. public void createIndex() throws IOException {
  8. //创建名称为blog2的索
  9. CreateIndexRequest request = new CreateIndexRequest( "blog1" );
  10. //设置映射 doc type名称
  11. request.mapping( "doc", " {\n" +
  12. " \t\"properties\": {\n" +
  13. " \"name\": {\n" +
  14. " \"type\": \"text\",\n" +
  15. " \"analyzer\":\"ik_max_word\",\n" +
  16. " \"search_analyzer\":\"ik_smart\"\n" +
  17. " },\n" +
  18. " \"description\": {\n" +
  19. " \"type\": \"text\",\n" +
  20. " \"analyzer\":\"ik_max_word\",\n" +
  21. " \"search_analyzer\":\"ik_smart\"\n" +
  22. " },\n" +
  23. " \"studymodel\": {\n" +
  24. " \"type\": \"keyword\"\n" +
  25. " },\n" +
  26. " \"price\": {\n" +
  27. " \"type\": \"float\"\n" +
  28. " }\n" +
  29. " }\n" +
  30. "}", XContentType.JSON );
  31. CreateIndexResponse createIndexResponse = client.indices().create( request );
  32. System.out.println( JSON.toJSONString( createIndexResponse ) );
  33. //释放资源
  34. client.close();
  35. }

2.2 删除索引

  1. /**
  2. * 删除索引
  3. */
  4. //删除索引库
  5. @Test
  6. public void testDeleteIndex() throws IOException {
  7. //删除索引请求对象
  8. DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest( "doc" );
  9. //删除索引
  10. DeleteIndexResponse deleteIndexResponse = client.indices().delete( deleteIndexRequest );
  11. //删除索引响应结果
  12. boolean acknowledged = deleteIndexResponse.isAcknowledged();
  13. System.out.println( acknowledged );
  14. }

2.3 插入文档

  1. /**
  2. * 插入文档
  3. */
  4. @Test
  5. public void testAddDocument() throws IOException {
  6. //准备json数据
  7. Map<String, Object> jsonMap = new HashMap<>();
  8. jsonMap.put( "name", "11spring cloud实战" );
  9. jsonMap.put( "description", "11本课程主要从四个章节进行讲解: 1.微服务架构入门 2.spring cloud基础入门 3.实战Spring Boot 4.注册中心eureka。" );
  10. jsonMap.put( "studymodel", "201001" );
  11. jsonMap.put( "price", 5.6f );
  12. //索引请求对象
  13. IndexRequest indexRequest = new IndexRequest( "blog1", "doc" ).id( "11" );
  14. //指定索引文档内容
  15. indexRequest.source( jsonMap );
  16. //索引响应对象
  17. IndexResponse index = client.index( indexRequest );
  18. //获取响应结果
  19. DocWriteResponse.Result result = index.getResult();
  20. System.out.println( result );
  21. }

2.4 更新文档

  1. /**
  2. * 更新文档
  3. */
  4. @Test
  5. public void updateDocument() throws IOException {
  6. UpdateRequest updateRequest = new UpdateRequest( "blog1", "doc", "11" );
  7. Map<String, String> map = new HashMap<>();
  8. map.put( "name", "spring cloud实战222" );
  9. updateRequest.doc( map );
  10. UpdateResponse update = client.update( updateRequest );
  11. RestStatus status = update.status();
  12. System.out.println( status );
  13. }

2.5 删除文档

  1. /**
  2. * 删除文档
  3. */
  4. @Test
  5. public void deleteDocument() throws IOException {
  6. String id = "AXIDNJoC19Z06cvw7_Gv";
  7. DeleteRequest deleteRequest = new DeleteRequest( "blog2", "doc", id );
  8. DeleteResponse delete = client.delete( deleteRequest );
  9. System.out.println( delete.status() );
  10. }

2.6 根据ID查询

  1. /**
  2. * 查询文档 根据ID查询
  3. */
  4. @Test
  5. public void getDocumentById() throws IOException {
  6. GetRequest getRequest = new GetRequest( "blog1", "doc", "11" );
  7. GetResponse response = client.get( getRequest );
  8. boolean exists = response.isExists();
  9. Map<String, Object> sourceAsMap = response.getSourceAsMap();
  10. System.out.println( sourceAsMap );
  11. }

2.7 查询所有文档

  1. /**
  2. * 搜索管理 查询所有文档
  3. */
  4. @Test
  5. public void testSearchAll() throws IOException {
  6. SearchRequest searchRequest = new SearchRequest( "blog1" );
  7. searchRequest.types( "doc" );
  8. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  9. searchSourceBuilder.query( QueryBuilders.matchAllQuery() );
  10. //source源字段过虑
  11. searchSourceBuilder.fetchSource( new String[]{"name", "studymodel", "description"}, new String[]{} );
  12. searchRequest.source( searchSourceBuilder );
  13. SearchResponse searchResponse = client.search( searchRequest );
  14. SearchHits hits = searchResponse.getHits();
  15. long totalHits = hits.getTotalHits();
  16. System.out.println( "total=" + totalHits );
  17. SearchHit[] searchHits = hits.getHits();
  18. for (SearchHit searchHit : searchHits) {
  19. String index = searchHit.getIndex();
  20. System.out.println( "index=" + index );
  21. String id = searchHit.getId();
  22. System.out.println( "id=" + id );
  23. String sourceAsString = searchHit.getSourceAsString();
  24. System.out.println( sourceAsString );
  25. Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
  26. //String articleId = String.valueOf( sourceAsMap.get( "id" ) );
  27. String title = (String) sourceAsMap.get( "name" );
  28. String content = (String) sourceAsMap.get( "description" );
  29. //System.out.println("articleId="+articleId);
  30. System.out.println( "title=" + title );
  31. System.out.println( "content=" + content );
  32. }
  33. }

2.8 分页查询

  1. /**
  2. * 搜索管理 分页查询
  3. */
  4. @Test
  5. public void testSearchByPage() throws IOException {
  6. //设置要查询的索引 和 type
  7. SearchRequest searchRequest = new SearchRequest( "blog1" );
  8. searchRequest.types( "doc" );
  9. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  10. searchSourceBuilder.query( QueryBuilders.matchAllQuery() );
  11. //分页查询,设置起始下标,从0开始
  12. searchSourceBuilder.from( 0 );
  13. //每页显示个数
  14. searchSourceBuilder.size( 2 );
  15. //source源字段过虑
  16. //searchSourceBuilder.fetchSource(new String[]{"title","id","content"},new String[]{} );
  17. searchSourceBuilder.fetchSource( new String[]{"name", "studymodel", "description"}, new String[]{} );
  18. searchRequest.source( searchSourceBuilder );
  19. SearchResponse search = client.search( searchRequest );
  20. SearchHits hits = search.getHits();
  21. long totalHits = hits.getTotalHits();
  22. System.out.println( totalHits );
  23. for (SearchHit searchHit : hits.getHits()) {
  24. String sourceAsString = searchHit.getSourceAsString();
  25. System.out.println( sourceAsString );
  26. }
  27. }

2.9 TeamQuey搜索

  1. /**
  2. * 搜索管理 Term Query精确查找 ,在搜索时会整体匹配关键字,不再将关键字分词 ,
  3. * 下面的语句:查询title 包含 spring 的文档
  4. */
  5. @Test
  6. public void testSearchTerm() throws IOException {
  7. //创建查询,设置索引
  8. SearchRequest searchRequest = new SearchRequest( "blog1" );
  9. //设置type
  10. searchRequest.types( "doc" );
  11. //设置查询条件
  12. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  13. searchSourceBuilder.query( QueryBuilders.termQuery( "name", "spring" ) );
  14. //source源字段过虑
  15. //searchSourceBuilder.fetchSource(new String[]{"title","id","content"},new String[]{});
  16. searchSourceBuilder.fetchSource( new String[]{"name", "studymodel", "description"}, new String[]{} );
  17. searchRequest.source( searchSourceBuilder );
  18. SearchResponse search = client.search( searchRequest );
  19. SearchHits hits = search.getHits();
  20. long totalHits = hits.getTotalHits();
  21. System.out.println( "总条数:" + totalHits );
  22. for (SearchHit searchHit : hits.getHits()) {
  23. String sourceAsString = searchHit.getSourceAsString();
  24. System.out.println( sourceAsString );
  25. }
  26. }

2.10 根据多个ID查询

  1. /**
  2. * 搜索管理 根据ID查询
  3. */
  4. @Test
  5. public void testSearchByID() throws IOException {
  6. //创建查询,设置索引
  7. SearchRequest searchRequest = new SearchRequest( "blog1" );
  8. //设置type
  9. searchRequest.types( "doc" );
  10. //设置查询条件
  11. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  12. String[] ids = {"11", "12"};
  13. List<String> stringList = Arrays.asList( ids );
  14. searchSourceBuilder.query( QueryBuilders.termsQuery( "_id", stringList ) );
  15. //source源字段过虑
  16. searchSourceBuilder.fetchSource( new String[]{"name", "studymodel", "description"}, new String[]{} );
  17. searchRequest.source( searchSourceBuilder );
  18. SearchResponse search = client.search( searchRequest );
  19. SearchHits hits = search.getHits();
  20. long totalHits = hits.getTotalHits();
  21. System.out.println( "总条数:" + totalHits );
  22. for (SearchHit searchHit : hits.getHits()) {
  23. String sourceAsString = searchHit.getSourceAsString();
  24. System.out.println( sourceAsString );
  25. }
  26. }

2.11 match Query

  1. /**
  2. * 搜索管理 match query 先分词后查找 minimum_should_match (如果实现三个词至少有两个词匹配如何实现)
  3. */
  4. @Test
  5. public void testSearchMatchMinimnum() throws IOException {
  6. //创建查询,设置索引
  7. SearchRequest searchRequest = new SearchRequest( "blog1" );
  8. //设置type
  9. searchRequest.types( "doc" );
  10. //设置查询条件
  11. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  12. //匹配关键字
  13. searchSourceBuilder.query( QueryBuilders.matchQuery( "name", "spring开发" ).minimumShouldMatch( "60%" ) );
  14. //source源字段过虑
  15. searchSourceBuilder.fetchSource( new String[]{"name", "studymodel", "description"}, new String[]{} );
  16. searchRequest.source( searchSourceBuilder );
  17. SearchResponse search = client.search( searchRequest );
  18. SearchHits hits = search.getHits();
  19. long totalHits = hits.getTotalHits();
  20. System.out.println( "总条数:" + totalHits );
  21. for (SearchHit searchHit : hits.getHits()) {
  22. String sourceAsString = searchHit.getSourceAsString();
  23. System.out.println( sourceAsString );
  24. }
  25. }

2.12 同时搜索多个Field

  1. /**
  2. * 搜索管理 同时搜索多个Field
  3. */
  4. @Test
  5. public void testSearchMultiMatch() throws IOException {
  6. //创建查询,设置索引
  7. SearchRequest searchRequest = new SearchRequest( "blog1" );
  8. //设置type
  9. searchRequest.types( "doc" );
  10. //设置查询条件
  11. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  12. //匹配关键字
  13. MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery( "Boot 开发", "name", "description" )
  14. .minimumShouldMatch( "50%" );
  15. multiMatchQueryBuilder.field( "name", 10 );//提升boost 表示权重提升10倍
  16. searchSourceBuilder.query( multiMatchQueryBuilder );
  17. //source源字段过虑
  18. searchSourceBuilder.fetchSource( new String[]{"name", "studymodel", "description"}, new String[]{} );
  19. searchRequest.source( searchSourceBuilder );
  20. SearchResponse search = client.search( searchRequest );
  21. SearchHits hits = search.getHits();
  22. long totalHits = hits.getTotalHits();
  23. System.out.println( "总条数:" + totalHits );
  24. for (SearchHit searchHit : hits.getHits()) {
  25. String sourceAsString = searchHit.getSourceAsString();
  26. System.out.println( sourceAsString );
  27. }
  28. }

2.13 布尔查询

  1. /**
  2. * 搜索管理 布尔查询
  3. */
  4. @Test
  5. public void testSearchBoolean() throws IOException {
  6. //创建搜索请求对象
  7. SearchRequest searchRequest = new SearchRequest( "blog1" );
  8. //设置type
  9. searchRequest.types( "doc" );
  10. 创建搜索源配置对象
  11. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  12. //source源字段过虑
  13. searchSourceBuilder.fetchSource( new String[]{"name", "studymodel", "description"}, new String[]{} );
  14. //multiQuery
  15. MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery( "Boot 开发", "name", "description" )
  16. .minimumShouldMatch( "50%" );
  17. multiMatchQueryBuilder.field( "name", 10 );//提升boost 表示权重提升10倍
  18. //TermQuery
  19. TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery( "studymodel", "201001" );
  20. // 布尔查询
  21. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  22. boolQueryBuilder.must( multiMatchQueryBuilder );
  23. boolQueryBuilder.must( termQueryBuilder );
  24. //设置布尔查询对象
  25. searchSourceBuilder.query( boolQueryBuilder );
  26. //设置搜索源配置
  27. searchRequest.source( searchSourceBuilder );
  28. //搜索
  29. SearchResponse search = client.search( searchRequest );
  30. SearchHits hits = search.getHits();
  31. long totalHits = hits.getTotalHits();
  32. System.out.println( "总条数:" + totalHits );
  33. for (SearchHit searchHit : hits.getHits()) {
  34. String sourceAsString = searchHit.getSourceAsString();
  35. System.out.println( sourceAsString );
  36. }
  37. }

2.14 过滤器

  1. /**
  2. * 搜索管理 过滤器
  3. */
  4. @Test
  5. public void testSearchFilter() throws IOException {
  6. //创建搜索请求对象
  7. SearchRequest searchRequest = new SearchRequest( "blog1" );
  8. //设置type
  9. searchRequest.types( "doc" );
  10. 创建搜索源配置对象
  11. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  12. //source源字段过虑
  13. searchSourceBuilder.fetchSource( new String[]{"name", "studymodel", "description"}, new String[]{} );
  14. //multiQuery 多field查询
  15. MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery( "Boot 开发", "name", "description" )
  16. .minimumShouldMatch( "50%" );
  17. multiMatchQueryBuilder.field( "name", 10 );//提升boost 表示权重提升10倍
  18. //多Field查询,添加到搜索源配置对象中
  19. searchSourceBuilder.query( multiMatchQueryBuilder );
  20. //TermQuery
  21. TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery( "studymodel", "201001" );
  22. //Term查询,添加到搜索源配置对象中
  23. searchSourceBuilder.query( termQueryBuilder );
  24. // 布尔查询
  25. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  26. boolQueryBuilder.must( searchSourceBuilder.query() );
  27. //过虑
  28. boolQueryBuilder.filter( QueryBuilders.termQuery( "studymodel", "201001" ) );
  29. boolQueryBuilder.filter( QueryBuilders.rangeQuery( "price" ).gte( 5 ).lte( 100 ) );
  30. //设置布尔查询对象
  31. searchSourceBuilder.query( boolQueryBuilder );
  32. //设置搜索源配置
  33. searchRequest.source( searchSourceBuilder );
  34. //搜索
  35. SearchResponse search = client.search( searchRequest );
  36. SearchHits hits = search.getHits();
  37. long totalHits = hits.getTotalHits();
  38. System.out.println( "总条数:" + totalHits );
  39. for (SearchHit searchHit : hits.getHits()) {
  40. String sourceAsString = searchHit.getSourceAsString();
  41. System.out.println( sourceAsString );
  42. }
  43. }

2.15 排序

  1. /**
  2. * 排序
  3. *
  4. * @throws IOException
  5. */
  6. @Test
  7. public void testSort() throws IOException {
  8. SearchRequest searchRequest = new SearchRequest( "blog1" );
  9. searchRequest.types( "doc" );
  10. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  11. //source源字段过虑
  12. searchSourceBuilder.fetchSource( new String[]{"name", "studymodel", "price", "description"}, new String[]{} );
  13. searchRequest.source( searchSourceBuilder );
  14. //布尔查询
  15. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  16. //过虑
  17. boolQueryBuilder.filter( QueryBuilders.rangeQuery( "price" ).gte( 0 ).lte( 100 ) );
  18. // 排序
  19. searchSourceBuilder.sort( new FieldSortBuilder( "studymodel" ).order( SortOrder.DESC ) );
  20. searchSourceBuilder.sort( new FieldSortBuilder( "price" ).order( SortOrder.ASC ) );
  21. //搜索
  22. SearchResponse searchResponse = client.search( searchRequest );
  23. SearchHits hits = searchResponse.getHits();
  24. SearchHit[] searchHits = hits.getHits();
  25. for (SearchHit hit : searchHits) {
  26. String sourceAsString = hit.getSourceAsString();
  27. System.out.println( sourceAsString );
  28. }
  29. }

2.16 高亮显示

  1. /**
  2. * 高亮显示
  3. *
  4. * @throws IOException
  5. */
  6. @Test
  7. public void testHighlight() throws IOException {
  8. SearchRequest searchRequest = new SearchRequest( "blog1" );
  9. searchRequest.types( "doc" );
  10. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  11. //source源字段过虑
  12. searchSourceBuilder.fetchSource( new String[]{"name", "studymodel", "price", "description"}, new String[]{} );
  13. searchRequest.source( searchSourceBuilder );
  14. //匹配关键字
  15. MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery( "实战", "name", "description" );
  16. searchSourceBuilder.query( multiMatchQueryBuilder );
  17. //布尔查询
  18. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  19. boolQueryBuilder.must( searchSourceBuilder.query() );
  20. //过虑
  21. boolQueryBuilder.filter( QueryBuilders.rangeQuery( "price" ).gte( 0 ).lte( 100 ) );
  22. //排序
  23. searchSourceBuilder.sort( new FieldSortBuilder( "studymodel" ).order( SortOrder.DESC ) );
  24. searchSourceBuilder.sort( new FieldSortBuilder( "price" ).order( SortOrder.ASC ) );
  25. //高亮设置
  26. HighlightBuilder highlightBuilder = new HighlightBuilder();
  27. highlightBuilder.preTags( "<tag>" );//设置前缀
  28. highlightBuilder.postTags( "</tag>" );//设置后缀
  29. // 设置高亮字段
  30. highlightBuilder.fields().add( new HighlightBuilder.Field( "name" ) );
  31. //highlightBuilder.fields().add(new HighlightBuilder.Field("description"));
  32. searchSourceBuilder.highlighter( highlightBuilder );
  33. SearchResponse searchResponse = client.search( searchRequest );
  34. SearchHits hits = searchResponse.getHits();
  35. SearchHit[] searchHits = hits.getHits();
  36. for (SearchHit hit : searchHits) {
  37. Map<String, Object> sourceAsMap = hit.getSourceAsMap();
  38. //名称
  39. String name = (String) sourceAsMap.get( "name" );
  40. //取出高亮字段内容
  41. Map<String, HighlightField> highlightFields = hit.getHighlightFields();
  42. if (highlightFields != null) {
  43. HighlightField nameField = highlightFields.get( "name" );
  44. if (nameField != null) {
  45. Text[] fragments = nameField.getFragments();
  46. StringBuffer stringBuffer = new StringBuffer();
  47. for (Text str : fragments) {
  48. stringBuffer.append( str.string() );
  49. }
  50. name = stringBuffer.toString();
  51. }
  52. }
  53. System.out.println( "高亮==" + name );
  54. String sourceAsString = hit.getSourceAsString();
  55. System.out.println( sourceAsString );
  56. }
  57. }

发表评论

表情:
评论列表 (有 0 条评论,55人围观)

还没有评论,来说两句吧...

相关阅读