es资料
# 数据库地址 jdbc.url=jdbc:mysql://127.0.0.1:3306/es_ik?serverTimezone=GMT&autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useAffectedRows=true&useSSL=false # 数据库用户名 jdbc.user=root # 数据库密码 jdbc.password=123456 # 数据库查询扩展词库sql语句 jdbc.reload.sql=select gel.lexicon_text as word from es_lexicon gel where gel.lexicon_type = 0 and gel.lexicon_status = 0 and gel.del_flag = 0 order by gel.lexicon_id desc # 数据库查询停用词sql语句 jdbc.reload.stopword.sql=select gel.lexicon_text as word from es_lexicon gel where gel.lexicon_type = 1 and gel.lexicon_status = 0 and gel.del_flag = 0 order by gel.lexicon_id desc # 数据库查询间隔时间 每隔10秒请求一次 jdbc.reload.interval=10 jdbc.className=com.mysql.cj.jdbc.Driver
permission java.net.SocketPermission "*", "connect,resolve"; permission java.lang.RuntimePermission "setContextClassLoader";
CREATE TABLE `es_lexicon` ( `lexicon_id` bigint(8) NOT NULL AUTO_INCREMENT COMMENT '词库id', `lexicon_text` varchar(20) NOT NULL COMMENT '词条关键词', `lexicon_type` int(1) NOT NULL DEFAULT '0' COMMENT '0扩展词库 1停用词库', `lexicon_status` int(1) NOT NULL DEFAULT '0' COMMENT '词条状态 0正常 1暂停使用', `del_flag` int(1) NOT NULL DEFAULT '0' COMMENT '作废标志 0正常 1作废', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`lexicon_id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='ES远程扩展词库表';
/** * 分页 * * @param * @param * @return */ @RequestMapping(value = "/doSearchPage", method = RequestMethod.GET) @ResponseBody public ResultMessage doSearchPage(@RequestParam("companyName") String companyName, @RequestParam(value = "pageNum",required = false) Integer pageNum, @RequestParam(value = "pageSize",required = false) Integer pageSize) { ResultMessage rs = new ResultMessage(); rs.setData(esSearchSevice.multiMatchQuery(companyName, pageNum, pageSize)); rs.setCode("200"); return rs; }
public PageBean<DbsCompanyVo> multiMatchQuery(String companyName, Integer pageNum, Integer pageSize) { //1.创建 SearchRequest搜索请求,并指定要查询的索引 SearchRequest searchRequest = new SearchRequest("dbs"); //2.创建 SearchSourceBuilder条件构造。 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //MultiMatch 查找 MultiMatchQueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery(companyName, "dbsCompany"); multiMatchQuery.operator(Operator.OR); searchSourceBuilder.query(multiMatchQuery); Integer from = (pageNum -1) * pageSize; searchSourceBuilder.from(from); searchSourceBuilder.size(pageSize); //3.将 SearchSourceBuilder 添加到 SearchRequest中 searchRequest.source(searchSourceBuilder); //4.执行查询 SearchResponse searchResponse = null; try { searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } //5.解析查询结果 System.out.println("花费的时长:" + searchResponse.getTook()); SearchHits hits = searchResponse.getHits(); System.out.println("符合条件的总文档数量:" + hits.getTotalHits().value); hits.forEach(p -> System.out.println("文档原生信息:" + p.getSourceAsString())); List<DbsCompanyVo> esProductTOS = new ArrayList<>(); for (org.elasticsearch.search.SearchHit hit : hits) { //如果不做高亮,则可以直接转为json,然后转为对象 // String value = hit.getSourceAsString(); // ESProductTO esProductTO = JSON.parseObject(value, ESProductTO.class); //解析高亮字段 //获取当前命中的对象的高亮的字段 Map<String, HighlightField> highlightFields = hit.getHighlightFields(); log.info("json-hit: " + JSONObject.toJSONString(hit)); //查询精确后的匹配分数值(可以用入参来进行判断做筛选过滤条件) float score = hit.getScore(); log.info("hit score : " + score); HighlightField productName = highlightFields.get("dbsCompany"); String newName = ""; if (productName != null) { //获取该高亮字段的高亮信息 Text[] fragments = productName.getFragments(); //将前缀、关键词、后缀进行拼接 for (Text fragment : fragments) { newName += fragment; } } Map<String, Object> sourceAsMap = hit.getSourceAsMap(); //将高亮后的值替换掉旧值(这里就是高亮显示的部分) sourceAsMap.put("content", newName); String json = JSONObject.toJSONString(sourceAsMap); DbsCompanyVo esProductTO = JSONObject.parseObject(json, DbsCompanyVo.class); esProductTO.setScore(new BigDecimal(score)); esProductTO.setGlCompany(newName); esProductTOS.add(esProductTO); } PageBean<DbsCompanyVo> pageBean = new PageBean<DbsCompanyVo>(esProductTOS); return pageBean; }
@Data public class PageBean<T> implements Serializable { //当前页 private Integer currentPage; // 总数 private Long totalNumber; // 列表 private List<T> list; public PageBean() { } public PageBean(Integer currentPage,Long totalNumber, List<T> list) { this.currentPage =currentPage; this.totalNumber = totalNumber; this.list = list; } }
ResultMessage rs = new ResultMessage(); //1.创建 SearchRequest搜索请求,并指定要查询的索引 SearchRequest searchRequest = new SearchRequest("dbs"); //2.创建 SearchSourceBuilder条件构造。 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //MultiMatch 查找 MultiMatchQueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery(companyName, "dbsCompany"); multiMatchQuery.operator(Operator.OR); searchSourceBuilder.query(multiMatchQuery); Integer from = (pageNum -1) * pageSize; searchSourceBuilder.from(from); searchSourceBuilder.size(pageSize); //searchSourceBuilder.size(1000); //3.将 SearchSourceBuilder 添加到 SearchRequest中 searchRequest.source(searchSourceBuilder); //4.执行查询 SearchResponse searchResponse = null; try { searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } //5.解析查询结果 System.out.println("花费的时长:" + searchResponse.getTook()); SearchHits hits = searchResponse.getHits(); System.out.println("符合条件的总文档数量:" + hits.getTotalHits().value); hits.forEach(p -> System.out.println("文档原生信息:" + p.getSourceAsString())); //List<DbsCompanyVo> esProductTOS = new ArrayList<>(); ArrayList<DbsCompanyVO> esProductTOS = new ArrayList<>(); for (org.elasticsearch.search.SearchHit hit : hits) { //如果不做高亮,则可以直接转为json,然后转为对象 // String value = hit.getSourceAsString(); // ESProductTO esProductTO = JSON.parseObject(value, ESProductTO.class); //解析高亮字段 //获取当前命中的对象的高亮的字段 Map<String, HighlightField> highlightFields = hit.getHighlightFields(); log.info("json-hit: " + JSONObject.toJSONString(hit)); //查询精确后的匹配分数值(可以用入参来进行判断做筛选过滤条件) float score = hit.getScore(); log.info("hit score : " + score); HighlightField productName = highlightFields.get("dbsCompany"); String newName = ""; if (productName != null) { //获取该高亮字段的高亮信息 Text[] fragments = productName.getFragments(); //将前缀、关键词、后缀进行拼接 for (Text fragment : fragments) { newName += fragment; } } Map<String, Object> sourceAsMap = hit.getSourceAsMap(); //将高亮后的值替换掉旧值(这里就是高亮显示的部分) sourceAsMap.put("content", newName); String json = JSONObject.toJSONString(sourceAsMap); DbsCompanyVO esProductTO = JSONObject.parseObject(json, DbsCompanyVO.class); esProductTO.setScore(new BigDecimal(score)); esProductTO.setGlCompany(newName); esProductTOS.add(esProductTO); } PageBean<DbsCompanyVO> pageBean = new PageBean<DbsCompanyVO>(pageNum, hits.getTotalHits().value, esProductTOS); rs.setCode("200"); rs.setData(pageBean); return rs; }
https://zhuanlan.zhihu.com/p/268169068
https://www.modb.pro/db/170601
https://blog.csdn.net/jsiostream/article/details/87272784?spm=1001.2101.3001.6650.8&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-8-87272784-blog-124242744.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-8-87272784-blog-124242744.pc_relevant_3mothn_strategy_recovery&utm_relevant_index=9