当前位置: 首页 > news >正文

天津网站建设方案策划怎样优化推广

天津网站建设方案策划,怎样优化推广,欧美企业网站模板,创意视觉网站ES 7.6 - JAVA应用基础操作篇 环境准备依赖配置 实体类准备使用说明索引/映射操作创建索引和映射索引和映射相关查询删除索引 文档操作插入数据更新数据删除数据批量操作 文档查询根据ID查询根据字段精准查询根据字段分词查询控制返回字段范围查询组合查询排序分页高亮搜索聚合… ES 7.6 - JAVA应用基础操作篇 环境准备依赖配置 实体类准备使用说明索引/映射操作创建索引和映射索引和映射相关查询删除索引 文档操作插入数据更新数据删除数据批量操作 文档查询根据ID查询根据字段精准查询根据字段分词查询控制返回字段范围查询组合查询排序分页高亮搜索聚合查询 场景查询实操查询2023年中男、女的数量并找出对应的最大/最小年龄查询在地址中包含 深圳 或者 备注中包含 积极 的 男性青年(18-30岁)要求根据关键字找出匹配项目标高亮实时预览分别找出男、女性别中年龄最小的三个人(TOP N)查询tag中带有某些标签的或者出身地在某某地的人按照年龄降序并且分页 总结 上文已经教了大家最基本的操作了那我们在java代码里面要如何实现呢本文的目的就是教大家在springboot框架下实现上文的API操作也就是CURD 环境准备 首先我们要知道ES的API都是HTTP请求所以什么语言都可以操作就是发送请求和处理返回而已嘛只是说现在这种封装不需要我们做有人做好了这种叫做ES的客户端 依赖配置 我们直接采用Spring-data-es的依赖先看一下版本依赖说明 这里建议客户端版本和你自身搭建的es版本保持一致es不同版本间api差异很大如果不想出现莫名其妙的错的最好一致所以这里我们选择springboot 2.3版本这里给出spring-data-es的官方文档 # springboot版本 parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.3.2.RELEASE/versionrelativePath/ !-- lookup parent from repository -- /parent# spring-elasticsearch依赖 dependencygroupIdorg.springframework.data/groupIdartifactIdspring-data-elasticsearch/artifactIdversion4.0.9.RELEASE/version /dependency 因为我这ES是7.6的所以选择使用HighLevelRestClient客户端虽然这个已经在高版本过时了(8.x)但是在7.x版本里面官方建议使用这个 项目引入依赖后使用非常简单文件中配置一下ES地址就可以愉快的访问啦 # yml配置文件 spring:elasticsearch:rest:uris: ip:portusername: password: 实体类准备 Data Document(indexName es_apply_test) public class EsTest {Idprivate Long id;Field(type FieldType.Text,analyzer ik_max_word)private String name;Field(type FieldType.Keyword)private String sex;Field(type FieldType.Integer)private Integer age;Field(type FieldType.Text,analyzer ik_max_word)private String remark;Field(type FieldType.Keyword)private String[] tag;Field(type FieldType.Text,analyzer ik_max_word)private String addressLocation;Field(type FieldType.Keyword)private String birthAddress;Field(type FieldType.Date,pattern yyyy-MM-dd HH:mm:ss,format DateFormat.custom)private Date createTime;Field(type FieldType.Boolean)private Boolean hasGirlFriend;public EsTest(){}// 下面都是为了生成测试数据而准备的private final static String[] citynew String[]{深圳,广州,上海,北京,武汉};private final static String[] addressnew String[]{北京市朝阳区北辰东路15号,上海市黄浦区人民大道200号,深圳市福田区福中三路市民中心C区,武汉市江岸区一元街道沿江大道188号,广州市花都区新华街新都大道68号};public static EsTest getRandomData(Long id){EsTest esTest new EsTest();esTest.setId(id);esTest.setName(RandomUtil.randomString(张三李四王五陈六江文档词测试,3));esTest.setSex(id%20 ? 男:女);esTest.setAge(RandomUtil.randomInt(15,30));esTest.setRemark(RandomUtil.randomString(活波开朗具有进取精神和团队精神有较强的动手能力。良好协调沟通能力适应力强反应快、积极、细心、灵活 具有一定的社会交往能力,15));esTest.setTag(new String[]{RandomUtil.randomString(活波开朗具有进取精神和团队精神有较强的动手能力。良好协调沟通能力适应力强反应快、积极、细心、灵活 具有一定的社会交往能力,3),RandomUtil.randomString(活波开朗具有进取精神和团队精神有较强的动手能力。良好协调沟通能力适应力强反应快、积极、细心、灵活 具有一定的社会交往能力,3),RandomUtil.randomString(活波开朗具有进取精神和团队精神有较强的动手能力。良好协调沟通能力适应力强反应快、积极、细心、灵活 具有一定的社会交往能力,3)});esTest.setAddressLocation(address[RandomUtil.randomInt(0,address.length-1)]);esTest.setBirthAddress(city[RandomUtil.randomInt(0,city.length-1)]);esTest.setCreateTime(RandomUtil.randomDay(0,100));esTest.setHasGirlFriend(id%40 ? true:false);return esTest;}}注解Document用来声明Java对象与ElasticSearch索引的关系 indexName 索引名称 type 索引类型 shards 主分区数量 replicas 副本分区数量 createIndex 索引不存在时是否自动创建索引默认true 不建议自动创建索引(自动创建的索引 是按着默认类型和默认分词器) 注解Id 表示索引的主键 注解Field 用来描述字段的ES数据类型是否分词等配置等于Mapping描述 index 设置字段是否索引默认是true如果是false则该字段不能被查询 store 默认为no,被store标记的fields被存储在和index不同的fragment中以便于快速检索。虽然store占用磁盘空间但是减少了计算。 type 数据类型(text、keyword、date、object、geo等) analyzer 对字段使用分词器注意一般如果要使用分词器字段的type一般是text。 format 定义日期时间格式详细见 官方文档: https://www.elastic.co/guide/reference/mapping/date-format/. 注解CompletionField 定义关键词索引 要完成补全搜索 analyzer 对字段使用分词器注意一般如果要使用分词器字段的type一般是text。 searchAnalyzer 显示指定搜索时分词器默认是和索引是同一个保证分词的一致性。 maxInputLength:设置单个输入的长度默认为50 UTF-16 代码点 使用说明 我们引入依赖后在使用的时候有四种使用方式下面我由简→难说明一下 ElasticsearchRepository自动生成简单CURD方法直接调用即可复杂的不友好ElasticsearchRestTemplate内部使用的是RestHighLevelClient它帮我们封装了一层RestHighLevelClient直接使用客户端自己封装客户端之前说了本质就是HTTP请求自己封装一下直接调API呗这比啥都好使 本文使用ElasticsearchRestTemplate对小白友好但是我个人强烈推荐直接用RestHighLevelClient因为这个支持得更全面还同时支持同步和异步操作本文有些操作也会用到这个 本文索引名称es_apply_test 客户端注入 索引/映射操作 创建索引和映射 Test void createIndexAndMapping() {IndexOperations indexOperations elasticsearchRestTemplate.indexOps(EsTest.class);// 判断索引是否已经存在if(!indexOperations.exists()){// 不存在则创建indexOperations.create();Document mapping indexOperations.createMapping(EsTest.class);indexOperations.putMapping(mapping);}log.info(使用API查询查看..................); }索引和映射相关查询 Test void queryIndexAndMapping() {IndexOperations indexOperations elasticsearchRestTemplate.indexOps(EsTest.class);boolean exists indexOperations.exists();log.info(索引是否存在{},exists);MapString, Object mapping indexOperations.getMapping();log.info(映射{},JSONObject.toJSONString(mapping));MapString, Object settings indexOperations.getSettings();log.info(索引设置{},JSONObject.toJSONString(settings));// 索引刷新这个功能用处后面讲理论的时候你会知道是干嘛的indexOperations.refresh(); }删除索引 Test void deletedIndex() {IndexOperations indexOperations elasticsearchRestTemplate.indexOps(EsTest.class);indexOperations.delete(); }文档操作 插入数据 /** 插入一条数据 */Testvoid insertDoc() {// 插入一条elasticsearchRestTemplate.save(EsTest.getRandomData(1L));// 同时插入多条 实际是遍历一条一条插入而不是用的bulk命令elasticsearchRestTemplate.save(EsTest.getRandomData(2L),EsTest.getRandomData(3L));}更新数据 /** 更新数据 */Testvoid updateDoc() throws IOException {// es的数据结构都是文档其实不存在文档更新每次更新都会产生新的文档(这个是很低效的)所以es在API方面也看的出来对更新不是很友好// 没办法虽然更新很低效但终究得改呀// 下面提供几种方式// 1.根据ID更新UpdateQuery build UpdateQuery.builder(1).withDocument(Document.parse({ \name\: \根据ID更新\ })).build();elasticsearchRestTemplate.update(build,elasticsearchRestTemplate.getIndexCoordinatesFor(EsTest.class));// 2.条件更新// 采用highLevel客户端根据查询条件 使用脚本更新 等同于_update_by_query APIUpdateByQueryRequest request new UpdateByQueryRequest(es_apply_test);request.setQuery(QueryBuilders.termQuery(age,24));request.setScript(new Script(ctx._source[age]300;ctx._source[remark]根据条件批量更新;));restHighLevelClient.updateByQuery(request, RequestOptions.DEFAULT);}删除数据 /** 删除数据 */Testvoid deleteDoc() throws IOException {// 1.根据ID删除elasticsearchRestTemplate.delete(1,EsTest.class);// 2.条件删除NativeSearchQuery build new NativeSearchQueryBuilder().withQuery(QueryBuilders.termQuery(id, 3)).build();elasticsearchRestTemplate.delete(build,EsTest.class,elasticsearchRestTemplate.getIndexCoordinatesFor(EsTest.class));}批量操作 /** 批量增、删、改操作 */Testvoid bulkDoc() throws IOException {// 量大的话强烈推荐这种方式因为ES本身是以查询突出修改的吞吐量并不高// 1. 批量插入BulkRequest insertRequest new BulkRequest();for(int i1;i20;i){IndexRequest indexRequest new IndexRequest(es_apply_test);indexRequest.id(String.valueOf(i));indexRequest.source(JSONObject.toJSONString(EsTest.getRandomData((long)i)),XContentType.JSON);insertRequest.add(indexRequest);}BulkResponse insertResult restHighLevelClient.bulk(insertRequest, RequestOptions.DEFAULT);log.info(是否失败: {},失败原因{},insertResult.hasFailures(),insertResult.buildFailureMessage());// 2. 批量更新BulkRequest updateRequest new BulkRequest();for(int i1;i5;i){UpdateRequest indexRequest new UpdateRequest();indexRequest.id(String.valueOf(i));indexRequest.index(es_apply_test);HashMapString, Object objectObjectHashMap new HashMap();objectObjectHashMap.put(name,bulk批量更新);indexRequest.doc(objectObjectHashMap);updateRequest.add(indexRequest);}BulkResponse updateResult restHighLevelClient.bulk(updateRequest, RequestOptions.DEFAULT);log.info(是否失败: {},失败原因{},updateResult.hasFailures(),updateResult.buildFailureMessage());// 3. 批量删除BulkRequest deleteRequest new BulkRequest();for(int i1;i5;i){DeleteRequest request new DeleteRequest();request.id(String.valueOf(i));request.index(es_apply_test);updateRequest.add(request);}BulkResponse deleteResult restHighLevelClient.bulk(deleteRequest, RequestOptions.DEFAULT);log.info(是否失败: {},失败原因{},deleteResult.hasFailures(),deleteResult.buildFailureMessage());// 当然也可混合操作 就是 _bulk API}文档查询 根据ID查询 /** 根据id查 */Testvoid getDataById() {EsTest esTest elasticsearchRestTemplate.get(1, EsTest.class);log.info(结果{}, JSONObject.toJSONString(esTest));}根据字段精准查询 Testvoid termQuery() {// term 精准查询TermQueryBuilder termQuery QueryBuilders.termQuery(age, 10);NativeSearchQuery nativeSearchQuery new NativeSearchQuery(termQuery);SearchHitsEsTest termResult elasticsearchRestTemplate.search(nativeSearchQuery, EsTest.class);log.info(term- 总数量{} 结果{}, termResult.getTotalHits(),JSONObject.toJSONString(termResult.getSearchHits()));// terms 精准查询TermsQueryBuilder termsQueryBuilder QueryBuilders.termsQuery(tag, 良心力, 高于动);NativeSearchQuery nativeSearchQuery1 new NativeSearchQuery(termsQueryBuilder);SearchHitsEsTest termsResult elasticsearchRestTemplate.search(nativeSearchQuery1, EsTest.class);log.info(terms- 总数量{} 结果{}, termsResult.getTotalHits(),JSONObject.toJSONString(termsResult.getSearchHits()));}根据字段分词查询 /** 根据字段分词查询 */Testvoid matchQuery() {// matchall 全量查询 默认是分页查询10条MatchAllQueryBuilder matchAllQueryBuilder QueryBuilders.matchAllQuery();NativeSearchQuery nativeSearchQuery new NativeSearchQuery(matchAllQueryBuilder);SearchHitsEsTest matchAll elasticsearchRestTemplate.search(nativeSearchQuery, EsTest.class);log.info(match all- 总数量{} 结果{}, matchAll.getTotalHits(),JSONObject.toJSONString(matchAll.getSearchHits()));// match 根据字段分词查询(字段分词)MatchQueryBuilder matchQueryBuilder QueryBuilders.matchQuery(addressLocation, 街道);NativeSearchQuery nativeSearchQuery1 new NativeSearchQuery(matchQueryBuilder);SearchHitsEsTest match elasticsearchRestTemplate.search(nativeSearchQuery1, EsTest.class);log.info(match - 总数量{} 结果{}, match.getTotalHits(),JSONObject.toJSONString(match.getSearchHits()));// match_phrase 根据字段分词查询(字段不分词)MatchPhraseQueryBuilder matchPhraseQueryBuilder QueryBuilders.matchPhraseQuery(addressLocation, 街道,武汉);NativeSearchQuery nativeSearchQuery2 new NativeSearchQuery(matchPhraseQueryBuilder);SearchHitsEsTest matchPhrase elasticsearchRestTemplate.search(nativeSearchQuery2, EsTest.class);log.info(match_phrase - 总数量{} 结果{}, matchPhrase.getTotalHits(),JSONObject.toJSONString(matchPhrase.getSearchHits()));// multi_match 根据字段分词查询多个字段MultiMatchQueryBuilder multiMatchQueryBuilder QueryBuilders.multiMatchQuery(街道,武汉,队协, addressLocation, remark);NativeSearchQuery nativeSearchQuery3 new NativeSearchQuery(multiMatchQueryBuilder);SearchHitsEsTest multiMatch elasticsearchRestTemplate.search(nativeSearchQuery3, EsTest.class);log.info(multiMatch - 总数量{} 结果{}, multiMatch.getTotalHits(),JSONObject.toJSONString(multiMatch.getSearchHits()));}控制返回字段 /** 控制返回字段 */Testvoid fieldFilterQuery() {// matchall 全量查询 并控制返回字段NativeSearchQuery build new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchAllQuery()).withFields(id, name).build();SearchHitsEsTest matchAll elasticsearchRestTemplate.search(build, EsTest.class);log.info(match all- 总数量{} 结果{}, matchAll.getTotalHits(),JSONObject.toJSONString(matchAll.getSearchHits()));}范围查询 /** 范围查询 */Testvoid rangeQuery() {// 范围查询 并控制返回字段NativeSearchQuery build new NativeSearchQueryBuilder().withQuery(QueryBuilders.rangeQuery(age).gte(20).lte(30)).withFields(id, name,age).build();SearchHitsEsTest matchAll elasticsearchRestTemplate.search(build, EsTest.class);log.info(match all- 总数量{} 结果{}, matchAll.getTotalHits(),JSONObject.toJSONString(matchAll.getSearchHits()));}组合查询 /** 组合查询 and 、or 、 */Testvoid boolGroupQuery() {// 范围查询 并控制返回字段// 10岁 男NativeSearchQuery build new NativeSearchQueryBuilder().withQuery(QueryBuilders.boolQuery().must(QueryBuilders.termQuery(age,23)).mustNot(QueryBuilders.termQuery(sex,男))).withFields(id, name,age,sex).build();SearchHitsEsTest matchAll elasticsearchRestTemplate.search(build, EsTest.class);log.info(match all- 总数量{} 结果{}, matchAll.getTotalHits(),JSONObject.toJSONString(matchAll.getSearchHits()));}排序分页 /** 排序分页 */Testvoid sortAndPageQuery() {// 排序分页 排序可以多个NativeSearchQuery build new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchAllQuery()).withSort(SortBuilders.fieldSort(age).order(SortOrder.ASC)).withSort(SortBuilders.fieldSort(id).order(SortOrder.DESC)).withSort(SortBuilders.scoreSort()).withFields(id, name,age,sex).withPageable(PageRequest.of(0,5)).build();SearchHitsEsTest matchAll elasticsearchRestTemplate.search(build, EsTest.class);log.info(match all- 总数量{} 结果{}, matchAll.getTotalHits(),JSONObject.toJSONString(matchAll.getSearchHits()));}高亮搜索 /** 高亮搜索 */Testvoid highlightQuery() {// 高亮搜索NativeSearchQuery build new NativeSearchQueryBuilder().withQuery(QueryBuilders.multiMatchQuery(武汉深圳, addressLocation, remark)).withFields(id, name,addressLocation,remark).withHighlightBuilder(new HighlightBuilder().preTags(span stylecolor:red).postTags(/span)).withHighlightFields(new HighlightBuilder.Field(addressLocation),new HighlightBuilder.Field(remark)).build();SearchHitsEsTest matchAll elasticsearchRestTemplate.search(build, EsTest.class);log.info(match all- 总数量{} 结果{}, matchAll.getTotalHits(),JSONObject.toJSONString(matchAll.getSearchHits()));}聚合查询 /** 聚合查询 */Testvoid aggregateQuery() {// 不分组 聚合查询NativeSearchQuery build new NativeSearchQueryBuilder().addAggregation(AggregationBuilders.avg(ageAvg).field(age)).addAggregation(AggregationBuilders.sum(ageSum).field(age)).addAggregation(AggregationBuilders.max(ageMax).field(age)).addAggregation(AggregationBuilders.min(ageMin).field(age)).withPageable(PageRequest.of(0,1)) // 应该设置为0因为只需要聚合数据但无赖有校验设置不了.build();SearchHitsEsTest search elasticsearchRestTemplate.search(build, EsTest.class);log.info(match all- 总数量{} 结果{}, search.getTotalHits(),JSONObject.toJSONString(search.getAggregations()));// 先分组 在聚合NativeSearchQuery build1 new NativeSearchQueryBuilder().addAggregation(AggregationBuilders.terms(groupBySex).field(sex).subAggregation(AggregationBuilders.avg(ageAvg).field(age)).subAggregation(AggregationBuilders.sum(ageSum).field(age)).subAggregation(AggregationBuilders.max(ageMax).field(age)).subAggregation(AggregationBuilders.min(ageMin).field(age))).withPageable(PageRequest.of(0,1)) // 应该设置为0因为只需要聚合数据但无赖有校验设置不了.build();SearchHitsEsTest search1 elasticsearchRestTemplate.search(build1, EsTest.class);MapString, Aggregation map search1.getAggregations().asMap();Aggregation groupBySex map.get(groupBySex);log.info(打断点看吧{},groupBySex);}场景查询实操 查询2023年中男、女的数量并找出对应的最大/最小年龄 /** 查询2023年中男、女的数量并找出对应的最大/最小年龄 */Testvoid demo1() {NativeSearchQuery build new NativeSearchQueryBuilder().addAggregation(AggregationBuilders.terms(groupBySex).field(sex).subAggregation(AggregationBuilders.count(count).field(id)).subAggregation(AggregationBuilders.max(maxAge).field(age)).subAggregation(AggregationBuilders.min(minAge).field(age))).withPageable(PageRequest.of(0,1)).build();SearchHitsEsTest search elasticsearchRestTemplate.search(build, EsTest.class);log.info(打断点查看{},search.getAggregations());}查询在地址中包含 “深圳” 或者 备注中包含 “积极” 的 男性青年(18-30岁) 要求关键词高亮 /** 查询在地址中包含 深圳 或者 备注中包含 积极 的 男性青年(18-30岁),要求关键词高亮 */Testvoid demo2() {NativeSearchQuery build new NativeSearchQueryBuilder().withQuery(QueryBuilders.boolQuery().must(QueryBuilders.termQuery(sex,男)).must(QueryBuilders.rangeQuery(age).gte(18).lte(30)).must(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery(addressLocation,深圳)).should(QueryBuilders.matchQuery(remark,积极)))).withHighlightBuilder(new HighlightBuilder().preTags(span stylecolor:red).postTags(/span)).withHighlightFields(new HighlightBuilder.Field(addressLocation),new HighlightBuilder.Field(remark)).build();SearchHitsEsTest search elasticsearchRestTemplate.search(build, EsTest.class);log.info(总量{} 数据{},search.getTotalHits(),JSONObject.toJSONString(search.getSearchHits()));}要求根据关键字找出匹配项目标高亮实时预览 搜地址、名称返回 名称id 地址 /** 搜索框要求根据关键字找出匹配项目标高亮实时预览搜地址、名称返回 名称id 地址 */Testvoid demo3() {NativeSearchQuery build new NativeSearchQueryBuilder().withQuery(QueryBuilders.multiMatchQuery(林深,name,addressLocation)).withFields(id, name,addressLocation).withHighlightBuilder(new HighlightBuilder().preTags(span stylecolor:red).postTags(/span)).withHighlightFields(new HighlightBuilder.Field(addressLocation),new HighlightBuilder.Field(name)).build();SearchHitsEsTest search elasticsearchRestTemplate.search(build, EsTest.class);log.info(总量{} 数据{},search.getTotalHits(),JSONObject.toJSONString(search.getSearchHits()));}分别找出男、女性别中年龄最小的三个人(TOP N) /** 分别找出男、女性别中年龄最小的三个人(TOP N) */Testvoid demo4() {NativeSearchQuery build new NativeSearchQueryBuilder().addAggregation(AggregationBuilders.terms(groupBySex).field(sex).subAggregation(AggregationBuilders.topHits(top3).sort(age,SortOrder.ASC).fetchSource(new String[]{name,sex,age},null).size(3))).build();SearchHitsEsTest search elasticsearchRestTemplate.search(build, EsTest.class);log.info(打断点自己看-》总量{} 数据{},search.getTotalHits(),search.getAggregations());}查询tag中带有某些标签的或者出身地在某某地的人按照年龄降序并且分页 /** 查询tag中带有某些标签的或者出身地在某某地的人按照年龄降序并且分页 */Testvoid demo5() {NativeSearchQuery build new NativeSearchQueryBuilder().withQuery(QueryBuilders.boolQuery().should(QueryBuilders.termsQuery(tag,断能能,高于动,上格心,对朗步)).should(QueryBuilders.termsQuery(birthAddress,深圳,章丘))).withSort(SortBuilders.fieldSort(age).order(SortOrder.DESC)).withSort(SortBuilders.scoreSort().order(SortOrder.DESC)).withPageable(PageRequest.of(0,5)).build();SearchHitsEsTest search elasticsearchRestTemplate.search(build, EsTest.class);log.info(总量{} 数据{},search.getTotalHits(),search.getSearchHits());}总结 到了这恭喜你你也成功的入门ES成为了一名ES的CURD BOY但你觉得ES就仅仅如此吗少年加油吧才刚开始呢 后面会介绍一些重点操作以及相应的进阶理论知识理论会偏多
http://www.pierceye.com/news/102560/

相关文章:

  • 如何在年报网站上做遗失公告wordpress默认摘要
  • 中国网站服务器哪个好有哪些做公司网站
  • 做宠物的网站有哪些如何做电商生意
  • 具有品牌的常州做网站关于网站建设的广告词
  • 孝感网站推广品牌策划公司都有哪些
  • 保洁公司用哪些网站做推广wordpress aj提交评论
  • 互联网金融p2p网站建设模板简历模板免费下载网站
  • 绍兴建设网站制作3免费做网站
  • 东莞运营推广网站建设费用wordpress 单栏 主题
  • 律师事务所网站制作WordPress 经典博客
  • 建立网站功能wordpress微博头条
  • 多就能自己做网站取名网站怎么做
  • 网站域名百度云网站环境建设国家城乡建设规划部网站
  • 网站设计的实例wordpress 微博备份
  • 网络推销黑河网站seo
  • 天津市建设工程管理总队网站wordpress 自媒体模版
  • 用网站做宣传的方案郴州买房网站
  • 微信网站前景wordpress 主题开发教程
  • 基于php旅游网站的毕业设计太原网站建设主页
  • 硅谷网站开发薪酬网站建设 数据可视化
  • 绍兴网站建设设计制作高端的网站开发公司
  • 网站建设包括内容南阳网站建设价格
  • 天津平台网站建设哪里好深圳网络营销推广专员
  • 手机网站建设哪家好嘉定房地产网站建设
  • 酒店网站建设需求分析wordpress 文档模板
  • 品牌微信网站定制wordpress企业cms
  • 郑州网站推广效果免费的个人网页
  • 安徽平台网站建设找哪家安阳实力网站建设首选
  • 企业网站的建设要注意哪些方面免费字体下载网站
  • 建怎样的网站挣钱快网站怎么做微博认证吗