System.out.println(“I am back”);
需求10:俄罗斯印度公司的后端改造 背景 为了能尽快丰富页面实现seo,优先开放数据组刚挖掘出来的俄罗斯印度公司详细信息,当存量不足的时候再去按照原有逻辑开放普通公司。此外为了优化全球搜变动导致的页面失效,需要在出海项目的es里面保存一份副本,否则会影响谷歌收录。
改进结构
分为两个方面取数据,全球搜和扩展es,扩展es洗了一些俄罗斯印度公司的拓展信息用于展示,与全球搜主键id关联,从而可以组装起来作为一个更大的bo。但是如果当公司开放之后,全球搜es有变动导致无法访问就会严重影响谷歌收录。所以需要更改保存逻辑,直接在每日新增中执行组装,如果此时全球搜有那就保留,且写回扩展索引中。如果没有就跳过,这样以来所有的信息全部都持久化到扩展es中,用公式写就是A(全球搜)+B(扩展)->AB(组装后的大对象)->写回扩展es。
实现
sourceBuilder构造:查询指定国家,根据质量分数倒序排序,但是这样顺序开放会导致重复扫描的越来越多,后续一个小时有可能都跑不完了。
查询开放公司的最大dataId,然后追加dataId,得到原始输入List。
接下来要一个个去请求全球搜去组装一个更大的对象,如果返回有问题就过滤掉不入库,返回无问题就直接upsert拓展索引。
最后作为开放公司写入数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 @Override public int upsertExtendDetailToDbAndEs (String country, String param) { BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); boolQuery.must(QueryBuilders.termQuery("standardCountry" , country)); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder () .query(boolQuery) .fetchSource(new String []{"companyId" ,"name" }, null ) .sort("dataQualityScore" ,SortOrder.DESC) .size(Integer.parseInt(param)); List<SiteMapCompanyEntity> originalCompanyList = loadCompanyToExtendIndex(companyExtendIndex, sourceBuilder, param); List<SiteMapCompanyEntity> filterCompanyList = originalCompanyList.stream().filter(this ::filterAndUpsertCompanyExtendIndex).collect(Collectors.toList()); saveBatch(filterCompanyList); log.info("upsertExtendDetailToDbAndEs success record {}" ,filterCompanyList.size()); return filterCompanyList.size(); } @Override public void upsertNormalDetailToDbAndEs (String param) { Script hasDomainScript = new Script ("if(doc['domainCount'].size()>0 && doc['domainCount'].value>=1) return 1; else return 0" ); Script invalidDomainScript = new Script ("if(doc['domainStatus'].size()>0 && doc['domainStatus'].value>0) return 0; else return 1" ); Script hasEmailScript = new Script ("if(doc['emailCount'].size()>0 && doc['emailCount'].value>=1) return 1; else return 0" ); BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); boolQuery.must(QueryBuilders.existsQuery("overviewDescription" )); boolQuery.must(QueryBuilders.existsQuery("name" )); boolQuery.must(QueryBuilders.existsQuery("companyId" )); boolQuery.mustNot(QueryBuilders.termQuery("disable" , "true" )); boolQuery.must(QueryBuilders.wildcardQuery("overviewDescription" , "*" )); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder () .query(boolQuery) .fetchSource(new String []{"name" ,"companyId" }, null ) .size(1000 ) .sort(SortBuilders.scriptSort(hasDomainScript, ScriptSortBuilder.ScriptSortType.NUMBER).order(SortOrder.DESC)) .sort(SortBuilders.scriptSort(invalidDomainScript, ScriptSortBuilder.ScriptSortType.NUMBER).order(SortOrder.DESC)) .sort(SortBuilders.scriptSort(hasEmailScript, ScriptSortBuilder.ScriptSortType.NUMBER).order(SortOrder.DESC)); List<SiteMapCompanyEntity> originalCompanyList = loadCompanyToExtendIndex(openCompanyIndex, sourceBuilder, param); List<SiteMapCompanyEntity> filterCompanyList = originalCompanyList.stream().filter(this ::filterAndUpsertCompanyExtendIndex).collect(Collectors.toList()); saveBatch(filterCompanyList); log.info("upsertNormalDetailToDbAndEs success record {}" ,filterCompanyList.size()); }
查询索引并转换为数据库逻辑,输出是实际新增开放公司,小循环用set去重,大循环直接去数据库count>0去重。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 public <T> List<SiteMapCompanyEntity> loadCompanyToExtendIndex (AbstractIndex<T> abstractIndex,SearchSourceBuilder sourceBuilder,String param) { SiteMapCompanyEntity maxCompany = getMaxDataId(); long maxDataId = maxCompany == null ? 1 : maxCompany.getDataId(); AtomicInteger count = new AtomicInteger (); count.incrementAndGet(); List<SiteMapCompanyEntity> addList = new ArrayList <>(); abstractIndex.scrollSearch(sourceBuilder, searchHits -> { Set<String> companyIdSets = new HashSet <>(); for (SearchHit searchHit : searchHits) { if (addList.size() >= Integer.parseInt(param)) { return true ; } Map<String, Object> result = searchHit.getSourceAsMap(); String name = result.get("name" ).toString(); String companyId = result.get("companyId" ).toString(); if (companyIdSets.contains(companyId)) { continue ; } companyIdSets.add(companyId); if (isOpeningCompany(companyId)){ continue ; } SiteMapCompanyEntity siteMapCompanyEntity = convertIndexToDbEntity(name, companyId); siteMapCompanyEntity.setDataId(maxDataId + count.longValue()); count.getAndIncrement(); addList.add(siteMapCompanyEntity); log.info("loadCompanyToExtendIndex add record {}" ,JSON.toJSONString(siteMapCompanyEntity)); } return false ; }); return addList; }
最后在xxl-job里面定义定时任务,开两个定时任务,分别输入”Russia|1500”,”India|1500”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 @XxlJob("addExtendToOpenDb") public ReturnT<String> addExtendToOpenDb (String param) { param = StringUtils.isEmpty(param) ? "1500" : param; XxlJobLogger.log("addExtendToOpenDb job start" ); try { String[] params = param.split("\\|" ); if (params.length == 2 ) { int loadedSize = siteMapCompanyService.upsertExtendDetailToDbAndEs(params[0 ], params[1 ]); int remainSize = Integer.parseInt(params[1 ]) - loadedSize; if (remainSize > 0 ){ siteMapCompanyService.upsertNormalDetailToDbAndEs(String.valueOf(remainSize)); } } else if (params.length == 1 ) { siteMapCompanyService.upsertNormalDetailToDbAndEs(String.valueOf(params[0 ])); } } catch (Exception e) { XxlJobLogger.log("addExtendToOpenDb error" ); log.error("addExtendToOpenDb error" , e); } XxlJobLogger.log("addExtendToOpenDb job end" ); return ReturnT.SUCCESS; }
需求11:AIGC能力——大模型总结网页 背景 前面补充的数据还是没能影响seo,可能是因为数据不够独特,同质性太强。因此需要用ai总结一下,做出差异化的内容。
提示词 1 2 3 4 5 6 7 8 9 10 The following text is taken from the official website of a company named: [bi-ehealthcare]. Based on the content provided, generate 6-8 self-questions and answers related to the company's information. The question is information related to the company: the company's products, industry, services, address and contact information (telephone, email, etc.), and other points of fact mentioned in the content provided, but not limited to this. Provide quality responses and avoid general responses such as "Unfortunately, the text does not provide..." . Avoid interference from privacy policies and cookies, and ensure that the total length of the reply is not less than 500 characters. In particular. Organize and translate your answers in English, as shown below: Q1: XXXX, A1: XXXX, Q2: XXXX, A2: XXXX
大模型的原理(挖个坑、后续研究) 输入的是提示词和域名,大模型会去根据域名获得html页面,然后根据python某些工具去递归挖掘子url和html,拼接token,结合RAG从而获得更大规模的输入,然后根据提示词去调用llama3.2,得到输出。