elasticsearch实战篇

文章目录

  • 1.新建SpringBoot项目
    • 依赖
  • 2.实现
    • 配置模块 config
    • 控制层 controller
    • 模型层 model
    • 服务层 service
    • 工具 util
    • 主类
  • 单元测试

1.新建SpringBoot项目

依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.lagou</groupId><artifactId>es-project</artifactId><version>0.0.1-SNAPSHOT</version><name>es-project</name><description>Demo project for Spring Boot</description><properties><elasticsearch.version>7.3.0</elasticsearch.version></properties><dependencies><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>${elasticsearch.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch --><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>${elasticsearch.version}</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.3.0</version><exclusions><exclusion><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.3.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><!-- HttpClient --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.3</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.58</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!--devtools热部署--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional><scope>true</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

配置文件:application.yml

spring:devtools:restart:enabled: true  #设置开启热部署additional-paths: src/main/java #重启目录exclude: WEB-INF/**freemarker:cache: false    #页面不加载缓存,修改即时生效elasticsearch:rest:uris: 127.0.0.1:9200cert:username: rootpassword: rootserver:port: 8083logging:level:root: infocom.xdclass.search: debug

2.实现

配置模块 config

EsConfig.java

package com.learn.es.config;import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class EsConfig {@Value("${spring.elasticsearch.rest.uris}")private  String  hostlist;@Value("${spring.elasticsearch.cert.username}")private String certUsername;@Value("${spring.elasticsearch.cert.password}")private String certPassword;@Beanpublic RestHighLevelClient client() {//解析hostlist配置信息String[] split = hostlist.split(",");//创建HttpHost数组,其中存放es主机和端口的配置信息HttpHost[] httpHostArray = new HttpHost[split.length];for(int i=0;i<split.length;i++){String item = split[i];System.out.println(item);httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");}//账户密码//用户认证对象BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();//设置账户密码credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(certUsername, certPassword));//创建rest client对象RestClientBuilder builder = RestClient.builder(httpHostArray).setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {@Overridepublic HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);}});;//创建RestHighLevelClient客户端return new RestHighLevelClient(builder);}
}

控制层 controller

package com.learn.es.controller;import com.learn.es.service.PositionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.io.IOException;
import java.util.List;
import java.util.Map;@Controller
public class PositionController {@Autowiredprivate PositionService  service;// 测试页面@GetMapping({"/","/index"})public   String  indexPage(){return  "index";}@GetMapping("/search/{keyword}/{pageNo}/{pageSize}")@ResponseBodypublic  List<Map<String,Object>>  searchPosition(@PathVariable("keyword") String  keyword,@PathVariable("pageNo")int pageNo,@PathVariable("pageSize")int  pageSize)throws  IOException{List<Map<String,Object>> list = service.searchPos(keyword, pageNo, pageSize);return  list;}@RequestMapping("/importAll")@ResponseBodypublic   String  importAll(){try {service.importAll();} catch (IOException e) {e.printStackTrace();}return  "success";}
}

模型层 model

package com.learn.es.model;import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Position {//主键private String id;//公司名称private String companyName;//职位名称private String positionName;//职位诱惑private String  positionAdvantage;//薪资private String salary;//薪资下限private int salaryMin;//薪资上限private int salaryMax;//学历private String education;//工作年限private String workYear;//发布时间private String publishTime;//工作城市private String city;//工作地点private String workAddress;//创建时间@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date createTime;//工作模式private String jobNature;
}

服务层 service

PositionService.java

package com.learn.es.service;import java.io.IOException;
import java.util.List;
import java.util.Map;public interface PositionService {/* 分页查询 */public List<Map<String,Object>>  searchPos(String keyword,int pageNo,int pageSize)throws  IOException;/**导入数据 */void   importAll()throws IOException;
}

PositionServiceImpl.java

package com.learn.es.service.impl;import com.learn.es.service.PositionService;
import com.learn.es.util.DBHelper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.bulk.BackoffPolicy;
import org.elasticsearch.action.bulk.BulkProcessor;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;import org.elasticsearch.common.unit.ByteSizeUnit;
import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.Serializable;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer;@Service
public class PositionServiceImpl  implements PositionService {private  static  final Logger  logger = LogManager.getLogger(PositionServiceImpl.class);@Autowiredprivate RestHighLevelClient  client;private  static  final  String  POSITION_INDEX = "position";public List<Map<String, Object>> search(String keyword, String matchField, int pageNo, int pageSize) throws IOException {if (pageNo <= 1){pageNo = 1;}// 搜索SearchRequest  searchRequest = new SearchRequest(POSITION_INDEX);SearchSourceBuilder  searchSourceBuilder = new SearchSourceBuilder();// 分页设置searchSourceBuilder.from((pageNo-1)*pageSize);searchSourceBuilder.size(pageSize);QueryBuilder builder = QueryBuilders.matchQuery(matchField, keyword);searchSourceBuilder.query(builder);searchSourceBuilder.timeout(new TimeValue(60,TimeUnit.SECONDS));// 执行搜索searchRequest.source(searchSourceBuilder);SearchResponse  searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);ArrayList<Map<String,Object>>  list = new ArrayList<>();SearchHit[]  hits = searchResponse.getHits().getHits();for (SearchHit hit:hits){list.add(hit.getSourceAsMap());}return list;}@Overridepublic List<Map<String, Object>> searchPos(String keyword, int pageNo, int pageSize) throws IOException {List<Map<String, Object>> list = search(keyword, "positionName", pageNo, pageSize);if (list.size() < 5){List<Map<String, Object>> list2 = search(keyword, "positionAdvantage", pageNo, pageSize);list.addAll(list2);}return list;}@Overridepublic void importAll() throws IOException {writeMySQLDataToES("position");}private   void  writeMySQLDataToES(String tableName){BulkProcessor  bulkProcessor  = getBulkProcessor(client);Connection  connection = null;PreparedStatement  ps = null;ResultSet  rs = null;try {connection = DBHelper.getConn();logger.info("start handle data :" + tableName);String  sql = "select * from " + tableName;ps = connection.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);// 根据自己需要设置 fetchSizeps.setFetchSize(20);rs = ps.executeQuery();ResultSetMetaData  colData = rs.getMetaData();ArrayList<HashMap<String,String>> dataList = new ArrayList<>();HashMap<String,String>  map = null;int  count = 0;// c 就是列的名字   v 就是列对应的值String  c = null;String  v = null;while(rs.next()){count ++;map = new HashMap<String,String>(128);for (int i=1;i< colData.getColumnCount();i++){c = colData.getColumnName(i);v = rs.getString(c);map.put(c,v);}dataList.add(map);// 每1万条 写一次   不足的批次的数据 最后一次提交处理if (count % 10000 == 0){logger.info("mysql handle data  number:"+count);// 将数据添加到 bulkProcessorfor (HashMap<String,String> hashMap2 : dataList){bulkProcessor.add(new IndexRequest(POSITION_INDEX).source(hashMap2));}// 每提交一次 清空 map 和  dataListmap.clear();dataList.clear();}}// 处理 未提交的数据for (HashMap<String,String> hashMap2 : dataList){bulkProcessor.add(new IndexRequest(POSITION_INDEX).source(hashMap2));}bulkProcessor.flush();} catch (SQLException e) {e.printStackTrace();}finally {try {rs.close();ps.close();connection.close();boolean  terinaFlag = bulkProcessor.awaitClose(150L,TimeUnit.SECONDS);logger.info(terinaFlag);} catch (Exception e) {e.printStackTrace();}}}private BulkProcessor getBulkProcessor(RestHighLevelClient client) {BulkProcessor bulkProcessor = null;try {BulkProcessor.Listener listener = new BulkProcessor.Listener() {@Overridepublic void beforeBulk(long executionId, BulkRequest request) {logger.info("Try to insert data number : "+ request.numberOfActions());}@Overridepublic void afterBulk(long executionId, BulkRequest request,BulkResponse response) {logger.info("************** Success insert data number : "+ request.numberOfActions() + " , id: " + executionId);}@Overridepublic void afterBulk(long executionId, BulkRequest request, Throwable failure) {logger.error("Bulk is unsuccess : " + failure + ", executionId: " + executionId);}};BiConsumer<BulkRequest, ActionListener<BulkResponse>> bulkConsumer = (request, bulkListener) -> client.bulkAsync(request, RequestOptions.DEFAULT, bulkListener);BulkProcessor.Builder builder = BulkProcessor.builder(bulkConsumer, listener);builder.setBulkActions(5000);builder.setBulkSize(new ByteSizeValue(100L, ByteSizeUnit.MB));builder.setConcurrentRequests(10);builder.setFlushInterval(TimeValue.timeValueSeconds(100L));builder.setBackoffPolicy(BackoffPolicy.constantBackoff(TimeValue.timeValueSeconds(1L), 3));// 注意点:让参数设置生效bulkProcessor = builder.build();} catch (Exception e) {e.printStackTrace();try {bulkProcessor.awaitClose(100L, TimeUnit.SECONDS);} catch (Exception e1) {logger.error(e1.getMessage());}}return bulkProcessor;}
}

工具 util

package com.learn.es.util;import java.sql.Connection;
import java.sql.DriverManager;public class DBHelper {public static final String url = "jdbc:mysql://127.0.0.1:3306/lagou_position?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";public static final String name = "com.mysql.cj.jdbc.Driver";public static final String user = "root";public static final String password = "";private  static Connection  connection = null;public  static   Connection  getConn(){try {Class.forName(name);connection = DriverManager.getConnection(url,user,password);}catch (Exception e){e.printStackTrace();}return  connection;}
}

主类

package com.learn.es;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class EsBootApplication {public static void main(String[] args) {SpringApplication.run(EsBootApplication.class,args);}
}

单元测试

package com.learn.es;import org.apache.lucene.search.TotalHits;
import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.IndicesClient;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;@SpringBootTest
@RunWith(SpringRunner.class)
public class EsBootApplicationTest implements Serializable {@AutowiredRestHighLevelClient client;@Testpublic void testCreateIndex() throws Exception {//创建索引对象CreateIndexRequest createIndexRequest = newCreateIndexRequest("elasticsearch_test_wj");//设置参数createIndexRequest.settings(Settings.builder().put("number_of_shards", "1").put("number_of_replicas", "0"));// 指定映射XContentBuilder builder = XContentFactory.jsonBuilder().startObject().field("properties").startObject().field("studymodel").startObject().field("index","true").field("type", "keyword").endObject().field("name").startObject().field("index","true").field("type", "integer").endObject().field("description").startObject().field("index","true").field("type", "text").field("analyzer", "ik_max_word").endObject().field("pic").startObject().field("index","false").field("type", "text").endObject().endObject().endObject();createIndexRequest.mapping("doc", builder);/*指定映射createIndexRequest.mapping("doc"," {\n" +" \t\"properties\": {\n" +" \"studymodel\":{\n" +" \"type\":\"keyword\"\n" +" },\n" +" \"name\":{\n" +" \"type\":\"keyword\"\n" +" },\n" +" \"description\": {\n" +" \"type\": \"text\",\n" +" \"analyzer\":\"ik_max_word\" \n" +" },\n" +" \"pic\":{\n" +" \"type\":\"text\",\n" +" \"index\":false\n" +" }\n" +" \t}\n" +"}", XContentType.JSON);*///操作索引的客户端IndicesClient indices = client.indices();//执行创建索引库//CreateIndexResponse createIndexResponse =indices.create(createIndexRequest, RequestOptions.DEFAULT);CreateIndexResponse createIndexResponse =indices.create(createIndexRequest, RequestOptions.DEFAULT);//得到响应boolean acknowledged = createIndexResponse.isAcknowledged();System.out.println(acknowledged);}//删除索引库@Testpublic void testDeleteIndex() throws IOException {//删除索引的请求对象DeleteIndexRequest deleteIndexRequest = newDeleteIndexRequest("elasticsearch_test_wj");//操作索引的客户端IndicesClient indices = client.indices();//执行删除索引AcknowledgedResponse delete = indices.delete(deleteIndexRequest,RequestOptions.DEFAULT);//得到响应boolean acknowledged = delete.isAcknowledged();System.out.println(acknowledged);}//添加文档/*POST /elasticsearch_test/_doc/1{"name": "spring cloud实战",6) 其它搜索操作"description": "本课程主要从四个章节进行讲解: 1.微服务架构入门 2.spring cloud 基础入门 3.实战Spring Boot 4.注册中心eureka。","studymodel":"201001","timestamp": "2020-08-22 20:09:18","price": 5.6}*/@Testpublic void testAddDoc() throws IOException {//创建索引请求对象IndexRequest indexRequest = newIndexRequest("elasticsearch_test", "doc");indexRequest.id("1");//文档内容 准备json数据Map<String, Object> jsonMap = new HashMap<>();jsonMap.put("name", "spring cloud实战");jsonMap.put("description", "本课程主要从四个章节进行讲解: 1.微服务架构入门 2.spring cloud 基础入门 3.实战Spring Boot 4.注册中心eureka。");jsonMap.put("studymodel", "201001");SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");jsonMap.put("timestamp", dateFormat.format(new Date()));jsonMap.put("price", 5.6f);indexRequest.source(jsonMap);//通过client进行http的请求IndexResponse indexResponse =client.index(indexRequest, RequestOptions.DEFAULT);DocWriteResponse.Result result = indexResponse.getResult();System.out.println(result);}//查询文档@Testpublic void testGetDoc() throws IOException {//查询请求对象GetRequest getRequest = new GetRequest("elasticsearch_test", "1");GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);//得到文档的内容Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();System.out.println(sourceAsMap);}//搜索全部记录/*GET /elasticsearch_test/_search{"query":{"match_all":{}}}*/@Testpublic void testSearchAll() throws IOException, ParseException {//搜索请求对象SearchRequest searchRequest = new SearchRequest("elasticsearch_test");//搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//搜索方式//matchAllQuery搜索全部searchSourceBuilder.query(QueryBuilders.matchAllQuery());//设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段searchSourceBuilder.fetchSource(new String[]{"name", "studymodel", "price", "timestamp"}, new String[]{});//向搜索请求对象中设置搜索源searchRequest.source(searchSourceBuilder);//执行搜索,向ES发起http请求SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);//搜索结果SearchHits hits = searchResponse.getHits();//匹配到的总记录数TotalHits totalHits = hits.getTotalHits();//得到匹配度高的文档SearchHit[] searchHits = hits.getHits();//日期格式化对象SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");for (SearchHit hit : searchHits) {//文档的主键String id = hit.getId();//源文档内容Map<String, Object> sourceAsMap = hit.getSourceAsMap();String name = (String) sourceAsMap.get("name");//由于前边设置了源文档字段过虑,这时description是取不到的String description = (String) sourceAsMap.get("description");//学习模式String studymodel = (String) sourceAsMap.get("studymodel");//价格Double price = (Double) sourceAsMap.get("price");//日期Date timestamp = dateFormat.parse((String)sourceAsMap.get("timestamp"));System.out.println(name);System.out.println(studymodel);System.out.println(description);}}//分页查询@Testpublic void testSearchPage() throws IOException, ParseException {//搜索请求对象SearchRequest searchRequest = new SearchRequest("elasticsearch_test");//指定类型searchRequest.types("doc");//搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//设置分页参数//页码int page = 1;//每页记录数int size = 2;//计算出记录起始下标int from = (page - 1) * size;searchSourceBuilder.from(from);//起始记录下标,从0开始searchSourceBuilder.size(size);//每页显示的记录数//搜索方式//matchAllQuery搜索全部searchSourceBuilder.query(QueryBuilders.matchAllQuery());//设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段searchSourceBuilder.fetchSource(new String[]{"name", "studymodel", "price", "timestamp"}, new String[]{});//向搜索请求对象中设置搜索源searchRequest.source(searchSourceBuilder);//执行搜索,向ES发起http请求SearchResponse searchResponse =client.search(searchRequest, RequestOptions.DEFAULT);//搜索结果SearchHits hits = searchResponse.getHits();//匹配到的总记录数TotalHits totalHits = hits.getTotalHits();//得到匹配度高的文档SearchHit[] searchHits = hits.getHits();//日期格式化对象SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");for (SearchHit hit : searchHits) {//文档的主键String id = hit.getId();//源文档内容Map<String, Object> sourceAsMap = hit.getSourceAsMap();String name = (String) sourceAsMap.get("name");//由于前边设置了源文档字段过虑,这时description是取不到的String description = (String) sourceAsMap.get("description");//学习模式String studymodel = (String) sourceAsMap.get("studymodel");//价格Double price = (Double) sourceAsMap.get("price");//日期Date timestamp = dateFormat.parse((String)sourceAsMap.get("timestamp"));System.out.println(name);System.out.println(studymodel);System.out.println(description);}}//TermQuery@Testpublic void testTermQuery() throws IOException, ParseException {//搜索请求对象SearchRequest searchRequest = new SearchRequest("elasticsearch_test");//搜索源构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//搜索方式//termQuerysearchSourceBuilder.query(QueryBuilders.termQuery("name", "spring"));//设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段searchSourceBuilder.fetchSource(new String[]{"name", "studymodel", "price", "timestamp"}, new String[]{});//向搜索请求对象中设置搜索源searchRequest.source(searchSourceBuilder);//执行搜索,向ES发起http请求SearchResponse searchResponse =client.search(searchRequest, RequestOptions.DEFAULT);//搜索结果SearchHits hits = searchResponse.getHits();//匹配到的总记录数TotalHits totalHits = hits.getTotalHits();//得到匹配度高的文档SearchHit[] searchHits = hits.getHits();//日期格式化对象SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");for (SearchHit hit : searchHits) {//文档的主键String id = hit.getId();//源文档内容Map<String, Object> sourceAsMap = hit.getSourceAsMap();String name = (String) sourceAsMap.get("name");//由于前边设置了源文档字段过虑,这时description是取不到的String description = (String) sourceAsMap.get("description");//学习模式String studymodel = (String) sourceAsMap.get("studymodel");//价格Double price = (Double) sourceAsMap.get("price");//日期Date timestamp = dateFormat.parse((String)sourceAsMap.get("timestamp"));System.out.println(name);System.out.println(studymodel);System.out.println(description);}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 部署java服务

作业描述&#xff1a; &#xff08;1&#xff09;Hot是应用程序(springboot)&#xff0c;打成jar包&#xff1a;docker-demo-1.0-SNAPSHOT.jar &#xff08;2&#xff09;利用dockerfile将docker-demo-1.0-SNAPSHOT.jar构建成镜像docker-demo Dockerfile-docker-demo&#xf…

单向链表 双向链表 java代码实现

文章目录单向链表代码实现单元测试控制台打印头插法尾插法双向链表代码实现单元测试控制台打印头插法尾插法单向链表 代码实现 package csdn.dreamzuora.list;/*** author: weijie* Date: 2020/10/15 15:28* Description:*/ public class SingleNode {int id;String name…

栈、队列 java代码实现

文章目录普通队列数组实现java代码实现单元测试控制台打印链表实现java代码实现单元测试控制台打印LinkedList队列使用优先队列&#xff1a;PriorityQueue使用栈数组实现java代码实现单元测试控制台打印链表实现java代码实现单元测试控制台打印普通队列 概念&#xff1a;先入先…

递归学习 斐波那契 java代码实现

文章目录java代码单元测试java代码 package csdn.dreamzuora.recursion;/*** Title: 斐波那契额* Description:*斐波那契数列&#xff1a;0、1、1、2、3、5、8、13、21、34、55.....* f[n] f[n-2] f[n-1]* 优点&#xff1a;代码简单* 缺点&#xff1a;占用空间较大、如果递归…

二分查找 java代码实现

文章目录二分查找java代码单元测试二分查找java代码 package csdn.dreamzuora.query;/*** Title: 二分查找* Description:* 时间复杂度&#xff1a;log2N* version 1.0* author: weijie* date: 2020/10/16 13:52*/ public class BinarySearch implements Search {int[] array;…

二叉查找树 java代码实现

文章目录代码实现节点实现类二叉树实现单元测试代码实现 节点实现类 package csdn.dreamzuora.tree;/*** Title:* Description:** version 1.0* author: weijie* date: 2020/10/19 13:30*/ public interface Node { }package csdn.dreamzuora.tree;import java.io.Serializab…

红黑树 java代码实现

文章目录代码实现节点实现类红黑树实现单元测试代码实现 节点实现类 package csdn.dreamzuora.tree;/*** Title:* Description:** version 1.0* author: weijie* date: 2020/10/19 13:30*/ public interface Node { }package csdn.dreamzuora.tree;import java.io.Serializab…

冒泡排序、快速排序 java代码实现

文章目录冒泡排序源码实现单元测试优化快速排序源码实现单元测试冒泡排序 源码实现 package csdn.dreamzuora.sort;import java.util.List;/*** Title: 冒泡排序* Description:* 冒泡排序思想是把相邻的元素进行两两比较&#xff0c;当前面元素大于后面元素则进行交换* versi…

计数排序和桶排序 java代码实现

文章目录计数排序java代码实现单元测试桶排序java代码实现单元测试计数排序 java代码实现 package csdn.dreamzuora.sort;import java.util.List;/*** Title: 抽象出排序类* Description:** version 1.0* author: weijie* date: 2020/10/22 17:59*/ public abstract class So…

堆排序和归并排序 java代码实现

文章目录堆排序java代码实现单元测试归并排序java代码实现单元测试堆排序 java代码实现 package csdn.dreamzuora.sort;import java.util.List;/*** Title: 抽象出排序类* Description:** version 1.0* author: weijie* date: 2020/10/22 17:59*/ public abstract class Sort…

Hbase入门篇

HBase&#xff1a; 数据库&#xff1a;是一种面向列族存储的非关系型数据库用于存储结构化和非结构化数据&#xff1a;适用于单表非关系型数据的存储&#xff0c;不适合做关联查询&#xff0c;类似于JOIN等操作基于HDFS&#xff1a;数据持久化存储的体现形式是HFile&#xff0…

ElasticSearch入门篇

文章目录控制台RESTFULL操作REST风格说明基于REST命令说明&#xff1a;es支持的数据类型核心数据类型ik分词器使用ik_smart最少切分ik_max_word最细粒度索引操作索引库创建创建文档方式指定索引类型(以后这种方式会被弃用)不指定索引类型利用默认的_doc类型更新文档方式一&…

【待完成】并发包下常用到线程工具类汇总

文章目录并发容器BlockingQueueArrayBlockingQueueLinkedBlockingQueuePriorityBlockingDelayQueueSynchronousQueueBlockingDequeCopyOnWriteCopyOnWriteArrayListCopyOnWriteArraySetConcurrentLinkedQueue/DequeConcurrentHashMapConcurrentSkipListMap/Set同步工具类AQS实现…

判断对象属性值是否为空

private boolean checkObjFieldIsNotNull(Object obj){try {for (Field f : obj.getClass().getDeclaredFields()) {f.setAccessible(true);if (f.get(obj) ! null) {return true;}}}catch (IllegalAccessException e){}return false;}

爬虫中如何获取页面编码类型

获取页面的编码格式的三种方式&#xff1a; 根据Response中的header获取编码格式根据页面标签中的meta获取根据页面内容识别自动识别出编码格式&#xff0c;经过测试准确率比较高 三种方式可以结合使用&#xff0c;由于inputStream不能够被复用&#xff0c;但是inputStrem没有…

记录一次异常 java.lang.NoClassDefFoundError: org/apache/lucene/codecs/lucene53/Lucene53NormsFormat

异常信息&#xff1a; java.lang.NoClassDefFoundError: org/apache/lucene/codecs/lucene53/Lucene53NormsFormatat java.lang.Class.getDeclaredConstructors0(Native Method)at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)at java.lang.Class.getCon…

Spark集群部署与架构

在大数据时代&#xff0c;处理海量数据需要分布式计算框架。Apache Spark作为一种强大的大数据处理工具&#xff0c;可以在集群中高效运行&#xff0c;处理数十TB甚至PB级别的数据。本文将介绍如何构建和管理Spark集群&#xff0c;以满足大规模数据处理的需求。 Spark集群架构…

elasticsearch高级查询进阶

文章目录前期准备应用场景1.constant_score查询-不考虑文档频率得分&#xff0c;与搜索关键字命中更多的返回结果2.sort排序-分数相同情况下&#xff0c;按照指定价格域排序3.不考虑文档频率TF/IDF情况下&#xff0c;不同域打分权重不同进行召回4.不考虑文档频率TF/IDF情况下&a…

java核心技术-多线程并发设计原理以及常见面试题

文章目录写在前面多线程回顾Thread和Runnable面试官&#xff1a;为什么我们在项目中推荐使用使用Runnable方法而不用继承Thread&#xff1f;面试官&#xff1a;Callable为什么可以带返回值&#xff0c;你知道底层原理&#xff1f;面试题&#xff1a;线程了解&#xff1f;给我讲…

java核心技术-jvm基础知识

文章目录JVM回顾JVM、JRE、JDK之间关系&#xff1f;Java程序执行过程&#xff1f;面试官&#xff1a;解释执行和JIT(及时编译)两种执行方式有什么区别&#xff1f;java虚拟机内存管理jvm整体架构JVM只是定义内存划分规范等&#xff0c;具体实现依赖不同虚拟机实现&#xff0c;如…