es使用同义词插件注意事项

1 篇文章 0 订阅
订阅专栏
本文详细介绍了如何在Docker环境下安装和配置Elasticsearch 7.17.5,包括安装Ik中文分词插件和动态同义词插件。通过Spring Boot集成,实现了同义词的热更新功能,并提供了获取和初始化索引的接口。同时,文章指出当同义词接口异常时,插件不再调用的解决方案,涉及源码修改以确保服务稳定性。
摘要由CSDN通过智能技术生成

1背景描述

就是在不修改es查语句的情况下,实现同义词搜索。比如中国和china都是中国的意思,如果一篇文章中,只有中国,没有china英文,但是需要我们搜索次是china的时候也可以搜索出这边文章。问题,es重启之后, 插件不会在远程调用接口,这需要修改源码解决,待定。。。

2插件安装

1docker安装es:

拉镜像 es版本:7.17.5

docker pull elasticsearch:7.17.5

找个本地磁盘配置,配置文件:

cluster.name: "docker-cluster"
network.host: 0.0.0.0

#http.port: 9200
#添加配置 
http.cors.enabled: true
http.cors.allow-origin: "*"
#http.cors.allow-headers: Authorization
http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE 
http.cors.allow-headers: "X-Requested-With,X-Auth-Token,Content-Type, Content-Length, Authorization" 
discovery.zen.minimum_master_nodes: 1
#开启安全选项
xpack.security.enabled: false
 
#配置单节点模式
discovery.type: single-node

3 运行容器 -v挂在容器,使用自己的本地磁盘就行了。

docker network create somenetwork

docker run --restart=always -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms512m -Xmx512m" --net somenetwork -e "discovery.type=single-node" -v /Users/自己的用户名/work/soft/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /Users/自己的用户名/work/soft/elasticsearch/data:/usr/share/elasticsearch/data -v /Users/自己的用户名/work/soft/elasticsearch/plugins:/usr/share/elasticsearch/plugins --name myes -d elasticsearch:7.17.5

验证 docker logs 容器日志

2安装插件

注意都要根据es版本来安装插件

1 中文分词插件 Ik

这里由于在网上有这个版本的ik插件,直接下载:

https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.5/elasticsearch-analysis-ik-7.17.5.zip

然后解压放在,磁盘 :/Users/自己的用户名/work/soft/elasticsearch/plugins中,重启容器就可以。

验证方式,调用es接口看下,是否有正确的数据:

http://localhost:9200/_analyze
{
  "analyzer": "ik_max_word",
  "text": "我的名字叫猫爷"
 }

结果如下:
在这里插入图片描述

2 安装同义词插件elasticsearch-analysis-dynamic-synonym

但是由于github上,没有对应es的编译版本,所以需要下载源码本地编译。

1 下载:https://github.com/bells/elasticsearch-analysis-dynamic-synonym/releases
2 idea 打开,修改es版本
在这里插入图片描述
然后在命令行运行 mvn package
最后就会生成对应es版本的包:
在这里插入图片描述
3 把它复制到/Users/自己的用户名/work/soft/elasticsearch/plugins 中,重启 es的容器。
启动中可能会报错误

Exception in thread "main" java.nio.file.NotDirectoryException: /usr/share/elasticsearch/plugins/.DS_Store

解决方案在es对应的本机磁盘上删除这文件,删除/Users/自己的用户名/work/soft/elasticsearch/plugins里面的.DS_Store文件。

插件到这里就准备完成!

验证:等下直接写代码验证

3使用 spring-boot-starter-data-elasticsearch 集成同义词

结论:springboot版本:2.4.1,同义词使用热更新方式

springboot 的es配置

spring:
  elasticsearch:
    rest:
      uris: ["http://localhost:9200"]
      connection-timeout: 100
      read-timeout: 300

1实体类

VideoUserTestDO 用户信息对象

package com.ibird.pandaserviceadmin.es.model;

import java.util.List;

import javax.persistence.Id;

import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.Setting;

import lombok.Data;

@Data
@Setting(settingPath = "es/settings.json")
@Document(createIndex = true, indexName = "video-user-test", shards = 1, replicas = 1)
public class VideoUserTestDO {
    @Id
    String                     id;
    @Field(type = FieldType.Text, searchAnalyzer = "synonym", analyzer = "ik_max_word")
    String                     userName;
    @Field(type = FieldType.Text, searchAnalyzer = "synonym", analyzer = "ik_max_word")
    String                     nickName;
    @Field(type = FieldType.Text, searchAnalyzer = "synonym", analyzer = "ik_max_word")
    String                     info;
    int                        hotNum;
    @Field(type = FieldType.Text, searchAnalyzer = "synonym", analyzer = "ik_max_word")
    String                     desc;
    @Field(type = FieldType.Nested, store = true)
    List<VideoUserVideoInfoDO> userVideoInfoDOs;

}
}

VideoUserVideoInfoDO 为nested对象

package com.ibird.pandaserviceadmin.es.model;

import javax.persistence.Id;

import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import lombok.Data;

@Data
public class VideoUserVideoInfoDO {
    @Id
    @Field(type = FieldType.Keyword, store = true)
    String id;
    @Field(type = FieldType.Text, searchAnalyzer = "synonym", analyzer = "ik_max_word")
    String name;

}

2 同义词setting配置

放在了resources/es目录下的settings.json

{
  "index": {
    "analysis": {
      "analyzer": {
        "synonym": {
          "tokenizer": "ik_max_word",
          "filter": [
            "remote_synonym"
          ]
        }
      },
      "filter": {
        "remote_synonym": {
          "type": "dynamic_synonym",
          "synonyms_path": "http://192.168.2.100:8080/panda/video-user/synchronizeSynonym",
          "interval": 10
        },
        "local_synonym": {
          "type": "dynamic_synonym",
          "synonyms_path": "synonym.txt"
        },
        "synonym_graph": {
          "type": "dynamic_synonym_graph",
          "synonyms_path": "http://192.168.2.100:8080/panda/video-user/synchronizeSynonym"
        }
      }
    }
  }
}

说重点:
synonym 为分析器的名字,就是我们在实体类上指定的searchAnalyzer。
remote_synonym 为我们为es调用我们接口获取同义词的接口。
interval 调用接口间隔时间,单位秒

3获取同义词接口

案列非完善

@GetMapping(value = "/video-user/synchronizeSynonym")
    public String synchronizeSynonym(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String eTag = request.getHeader("If-None-Match");
        String modified = request.getHeader("If-Modified-Since");

        StringBuilder sb = new StringBuilder();
        sb.append("w").append(",").append("大爷").append("\n");
        sb.append("萱").append(",").append("xuan").append(",").append("旋").append("\n");

        // 更新时间
        response.setHeader("Last-Modified", new Date().getTime() + "");
        response.setHeader("ETag", "1");
        response.setHeader("Content-Type", "text/plain;charset=UTF-8");

        return sb.toString();
    }

注意点:
1 下面3个必须有,因为是根据Last-Modified与etag来判断是否有更新。
response.setHeader(“Last-Modified”, new Date().getTime() + “”);
response.setHeader(“ETag”, “1”);
response.setHeader(“Content-Type”, “text/plain;charset=UTF-8”);
这个是插件的源码
在这里插入图片描述
2 每次同步都是全量同步
那么这个接口的最终方式就是,根据你自定义lastModified来判断是否有更新,如果有更新,那么就全量把数据全量同步出去,如果没有就返回"“,如果返回空es不会更新老的值,所以有个关注点是,如果删除了所有的同义词,不能直接返回”",自己随便写一条正常的数据过去吧,比如1,1。

3接口如果报异常之后,es不会在定时去调用接口同步同义词,最后补充原因

4 初始化索引接口

 @Autowired
    VideoUserRepository     videoUserRepository;
    @Autowired
    RestHighLevelClient     restHighLevelClient;
    @Autowired
    ElasticsearchOperations elasticsearchOperations;
    
 // 初始化索引
    @GetMapping("/video-user/init")
    public void init() {
        IndexOperations indexOperations = elasticsearchOperations.indexOps(VideoUserTestDO.class);
        MappingBuilder builder = new MappingBuilder(elasticsearchOperations.getElasticsearchConverter());
        String mapping = builder.buildPropertyMapping(VideoUserTestDO.class);
        Document document = Document.parse(mapping);
        try {
            if (indexOperations.exists()) {
                indexOperations.delete();
                LogUtils.info(log, "索引已经存在,重新创建。");
            }
            indexOperations.create();
            indexOperations.putMapping(document);
            LogUtils.info(log, "索引创建成功...");
        } catch (Exception e) {
            LogUtils.error(e, log, "索引创建失败.原因:");
        }

    }

重点:
1 spring虽然会帮我们自动生成索引,但是@Setting(settingPath = “es/settings.json”) 这个不会自动生成, 这个@Field(type = FieldType.Text, searchAnalyzer = “synonym”, analyzer = “ik_max_word”)的 searchAnalyzer,analyzer 不会自动生成。反正我实验没成功,还是手动生成好点。
2 init方法只能在没有索引的时候才用,如果在已有的索引上添加字段,那么直接去调用es接口。个人是这样处理了,如果有其他方法,告诉我下,我学习一下。

5保存数据到es

es操作对象类

package com.ibird.pandaserviceadmin.es.repository;

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import com.ibird.pandaserviceadmin.es.model.VideoUserTestDO;

public interface VideoUserRepository extends ElasticsearchRepository<VideoUserTestDO, String> {}

@GetMapping("/video-user/save")
    public void save() {

        for (int i = 1; i < 6; i++) {
            VideoUserTestDO tmp = new VideoUserTestDO();
            tmp.setId(i + "");
            tmp.setUserName("萱萱" + i);
            tmp.setNickName("萱萱的昵称" + i);
            tmp.setInfo("我是萱萱的介绍");
            tmp.setDesc("我是描述" + i);
            List<VideoUserVideoInfoDO> list = new ArrayList<>();
            for (int j = 0; j < 5; j++) {
                VideoUserVideoInfoDO videoUserVideoInfoDO = new VideoUserVideoInfoDO();
                videoUserVideoInfoDO.setId("" + j);
                videoUserVideoInfoDO.setName("我是萱萱名字" + j);
                list.add(videoUserVideoInfoDO);
            }
            tmp.setUserVideoInfoDOs(list);

            videoUserRepository.save(tmp);
        }

    }

没啥好说的

6查询接口


   @GetMapping("/video-user/search")
    public String search(String word) {
        // boost评分权重
        // 调用一个方法查询到他的同义词
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.should(QueryBuilders.termQuery("userName.keyword", word).boost(100));
        boolQuery.should(QueryBuilders.matchQuery("userName", word).boost(10));
        boolQuery.should(QueryBuilders.termQuery("userVideoInfoDOs.name.keyword", word).boost(10));
        boolQuery.should(QueryBuilders.matchQuery("userVideoInfoDOs.name", word).boost(10));
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(100);
        FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(boolQuery);
        searchSourceBuilder.query(functionScoreQueryBuilder)
            .sort("hotNum", SortOrder.DESC).sort("_score", SortOrder.DESC);
        SearchRequest searchRequest = new SearchRequest("video-user-test");
        searchRequest.source(searchSourceBuilder);
        try {
            final SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
            final SearchHits hits = search.getHits();
            final SearchHit[] hits1 = hits.getHits();
            List<VideoUserTestDO> list = new ArrayList<>();
            for (SearchHit documentFields : hits1) {
                VideoUserTestDO videoUserTestDO = JSON.parseObject(documentFields.getSourceAsString(), VideoUserTestDO.class);
                list.add(videoUserTestDO);
            }
            return JSON.toJSONString(list);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "";
    }

查询接口,没什么好说的,就是所有满足添加的should查询(或者关系),然后跟你感觉重要的字段增加boost权重。最后根据自定义的热度值和es算出来的_score得分排序,得出结果。
不知道_score怎么计算的

4 同义词插件问题

背景:采用远程热更新,es会调用应用提供的一个获取同义词的接口,如果接口报异常之后(服务重启,挂了),es不会在定时去调用接口同步同义词,当时重启es也可以解决。
原因如下:是使用ScheduledThreadPool 这个定时的线城池定时调用接口,如果远程调研的子线程远程调用异常(应用服务挂了,超时,网络问题等),主线程不会在调用该任务。

private static final ScheduledExecutorService pool = Executors.newScheduledThreadPool(1, r -> {
        Thread thread = new Thread(r);
        thread.setName("monitor-synonym-Thread-" + id.getAndAdd(1));
        return thread;
    });
scheduledFuture = pool.scheduleAtFixedRate(new Monitor(synonymFile),
                                interval, interval, TimeUnit.SECONDS);

解决方案:
修改源码中的:
RemoteSynonymFile的这个方法reloadSynonymMap

public boolean isNeedReloadSynonymMap() {
        RequestConfig rc = RequestConfig.custom()
                .setConnectionRequestTimeout(10 * 1000)
                .setConnectTimeout(10 * 1000).setSocketTimeout(15 * 1000)
                .build();
        HttpHead head = AccessController.doPrivileged((PrivilegedAction<HttpHead>) () -> new HttpHead(location));
        head.setConfig(rc);

        // 设置请求头
        if (lastModified != null) {
            head.setHeader("If-Modified-Since", lastModified);
        }
        if (eTags != null) {
            head.setHeader("If-None-Match", eTags);
        }

        CloseableHttpResponse response = null;
        try {
            response = executeHttpRequest(head);
            if (response.getStatusLine().getStatusCode() == 200) { // 返回200 才做操作
                if (!response.getLastHeader(LAST_MODIFIED_HEADER).getValue()
                        .equalsIgnoreCase(lastModified)
                        || !response.getLastHeader(ETAG_HEADER).getValue()
                        .equalsIgnoreCase(eTags)) {

                    lastModified = response.getLastHeader(LAST_MODIFIED_HEADER) == null ? null
                            : response.getLastHeader(LAST_MODIFIED_HEADER)
                            .getValue();
                    eTags = response.getLastHeader(ETAG_HEADER) == null ? null
                            : response.getLastHeader(ETAG_HEADER).getValue();
                    return true;
                }
            } else if (response.getStatusLine().getStatusCode() == 304) {
                return false;
            } else {
                logger.info("remote synonym {} return bad code {}", location,
                        response.getStatusLine().getStatusCode());
            }
        }catch (Exception e){
            logger.error("远程调用同义词异常", e);
        } finally {
            try {
                if (response != null) {
                    response.close();
                }
            } catch (IOException e) {
                logger.error("failed to close http response", e);
            }
        }
        return false;
    }

就是新增了一个catch,这样,就解决了


catch (Exception e){
            logger.error("远程调用同义词异常", e);
        } 

效果如下:
在这里插入图片描述

Elasticsearch多字段搜索与价格范围过滤的Go语言实现
程序员光剑
07-27 32
在当今数字化时代,快速而精准的信息检索已成为各行各业的刚需。无论是电子商务平台、新闻门户网站,还是企业内部的文档管理系统,都需要一个强大的搜索引擎来支撑。Elasticsearch作为一个分布式、RESTful风格的搜索和分析引擎,凭借其高性能、可扩展性和灵活性,在全文检索领域占据了重要地位。本文将深入探讨如何使用Go语言实现Elasticsearch的多字段搜索和价格范围过滤功能。这两个功能在实际应用中极为常见,尤其是在电子商务领域。例如,用户可能想要搜索特定品牌、型号的商品,同时限定价格区间。
ElasticSearch技术解析与实战-朱林》
welcome to 一点点 home
03-11 2323
《第一章:ElasticSearchElasticSearch 简介: ElasticSearch 是一个实时的分布式搜索和分析引擎,它可以帮助你用非常短的时间去处理大规模数据。ElasticSearch 是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于Restful web 接口,ElasticSearch 是用java 开发的,并作为Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使
ES同义词插件 elasticsearch-analysis-dynamic-synonym-6.5.1.rar
07-17
现在官方插件没有6.x版本的,这是我从5.x修改到6.x的,该插件自测可使用6.2.2,6.8.x,希望能对你有所帮助
es同义词配置规则
最新发布
sang521jia的博客
03-24 564
2,a,b:通俗的来讲,就是不管用户输入的是a还是b,es在查询的是用a,或者b搜索.比如 保温杯,杯子,用户输入的是"保温杯",es会用"杯子"去做搜索,也会用"保温杯"搜索。搜索a的时候会同时再搜索b,搜索b的时候会同时再搜索a。1,a=>b: 通俗的来讲,就是尽管用户输入的是a,但是es在查询的是会转成b去搜索,"=>"左边的词全部会被右边的词替换。4.a,b=>a,b 搜索a就等于搜索a或者搜索b,搜索b就等于搜索a或者搜索b。3.a,b=>c 搜索a和b都会转成搜索c。
ES配置同义词
murenzhishang的博客
07-21 1576
背景:对原有的索引数据需要支持同义词搜索,即修改原索引数据的分词器 操作步骤如下: 1.上传同义词文件synonym.txt到es安装目录的config目录下,若是阿里云专有云环境,有专门的操作界面上传文件 2.新建索引,配置新索引的setting及mapping,即定义synonym过滤分词并在索引中使用 3.将原有索引数据迁移到新索引中_reindex 1.获取原有索引的mapping结构 GET good3/_mapping { "good3": { "mappings": { .
es同义词插件 热更新(dynamic-synonym插件
Li_services的博客
07-03 1463
1、下载同义词插件 https://github.com/bells/elasticsearch-analysis-dynamic-synonym 2、修改dynamic-synonym插件源码 2.1更新源码里面的es版本,es版本之前的差异很大 更新的很快一定要更新es的版本 2.2修改配置里面的db连接信息 jdbc.url=jdbc:oracle:thin:@10.111.12.11:5555 jdbc.user=ddd jdbc.password=ddd jdbc.rel...
ES同义词插件 analysis-dynamic-synonym7.5.1版本
06-29
elasticsearch-analysis-dynamic-synonym7.5.1版本 Elasticsearch 使用同义词插件
Elasticsearch2.4.4自定义词典&同义词配置
lln_avaj的专栏
12-17 1056
自定义词典: 一、添加词典 mkdir -p elasticsearch-2.4.4/plugins/analysis-ik/config/custom vi elasticsearch-2.4.4/plugins/analysis-ik/config/custom/ext_word.txt 博世 bosch 注意事项: 1,每个单词一行 2,编码为utf-8 无bom 二、修改i...
elasticsearch-analysis-ik-6.2.4(编译版)
10-21
- 扩展插件:除了基本分词功能,IK 还提供了如拼音、同义词扩展等插件,可以进一步提升搜索体验。 4. **注意事项** - 版本兼容性:务必确保 IK 分词器版本与 Elasticsearch 版本匹配,避免出现兼容性问题。 - ...
微服务04-elasticsearch
qq_47949604的博客
08-10 1519
索引库操作有哪些?创建索引库:PUT /索引库名查询索引库:GET /索引库名删除索引库:DELETE /索引库名添加字段:PUT /索引库名/_mapping文档操作有哪些?创建文档:POST /{索引库名}/_doc/文档id { json文档 }查询文档:GET /{索引库名}/_doc/文档id删除文档:DELETE /{索引库名}/_doc/文档id修改文档:全量修改:PUT /{索引库名}/_doc/文档id { json文档 }
ElasticSearh 同义词插件
01-15
插件地址 https://github.com/bells/elasticsearch-analysis-dynamic-synonym
es 同义词 热更新 1.1版本
04-23
NULL 博文链接:https://m635674608.iteye.com/blog/2262211
es5.3.2使用热词、停用词、同义词词典.rar
04-27
es5.3.2热词、停用词、同义词词典,包括插件压缩包,插件源码,远程词典服务端示例,配置说明等
ES同义词、扩展词、停止词热更新方案
热门推荐
zq199419951001的博客
05-07 1万+
最近要实现的一些功能需要让ES同义词、扩展词、停止词能够热更新,达到让搜索更精确的目的。在网上看了很多相关的博客,现在热更新的方案已经实施成功,现在来总结一下。 ES版本:5.5.2 IK分词器版本:5.5.2 扩展词、停止词 我的ES使用的中文分词器是IK分词器,IK分词器支持一种热更新的方案,部署一个web服务器,提供一个http接口,通过modified和tag两个http响应头...
ES-同词义配置
免费无法个性化定制
01-21 1100
语主相近或相同品牌类目关联搜索它等于搜索它增加analysis,处定义分词器修改name的分词器PUT /shop},},},
Elasticsearch——》es近义词(同义词)配置
小仙~
09-14 5177
系统:Linux 版本:elasticesearch7.6 根目录:/opt/app/elasticesearch7.6 1、近义词配置 进入目录:cd /opt/app/elasticesearch7.6/config 创建目录:mkdir analysis 进入目录:cd analysis 创建文件:touch tjdata-shop-synonym.txt tjdata-shop-synonym.txt 内容如下: 搜房,房天下 成交均价,成交单价,房价,售价 保障房,经济适用房,配套商品房,.
ES同义词
钱多多的博客
03-10 286
配置mapping PUT /megacorp { "mappings": { "properties": { "name":{ "type": "text", "analyzer": "ik-index" } } }, "settings": { "analysis": { "filter": { "local_synonym" : { "ty
ES-同义词配置
weidaiming007的博客
12-14 5341
同义词搜索的配置 PUT test_index { “settings”: { “number_of_shards”: 1, “analysis”: { “filter”: { “my_synonym_filter”:{ “type”:“synonym”, “synonyms_path”:“analysis /synonym.txt” } }, “analyzer”: { “ik_syno”:{ ...
ES总结(三)停词,同义词配置
大鸡腿的博客
08-18 1498
目录 前言 搜索 停词配置 同义词 如何实现动态配置同义词呢? 意义 前言 上次总结了es的搜索匹配算法等等,这次总结一下在es搜索的时候是将词语进行分词,那么我们如何让es更好的分词? 搜索 上一篇实践搜索优化 停词配置 设置了之后不会出现类型的词语 一般采用ik插件进行分词,具体百度,就是下载下来之后解压到es plugins/ik目录下 看下IKAnalyzer....
Elasticsearch 实例:使用同义词创建索引
总结来说,这个实例展示了如何在Elasticsearch中创建一个索引,该索引使用了自定义的同义词过滤器,以便在搜索时扩展用户输入的查询,同时考虑了同义词的关系。此外,还使用了n-gram分词器和IK分词器,以及多种字段...
写文章

热门文章

  • 黄图识别-open nsfw 56181
  • 快速理解bootstrap,bagging,boosting-三个概念 28036
  • 微信小程序的部署 23523
  • jenkins+svn+maven+tomcat一键构建部署 21360
  • 基于Spark的FPGrowth(关联规则算法) 19850

分类专栏

  • elasticsearch 1篇
  • java调优分享
  • 设计模式笔记 1篇
  • mongodb调优经验分享
  • spark相关 18篇
  • hadoop相关 1篇
  • 数据挖掘算法 11篇
  • 自然语言处理
  • hive 3篇
  • hbase 1篇
  • 数据库 1篇
  • 运维 5篇
  • 逻辑回归 1篇
  • 关联规则 1篇
  • FPGrowth 1篇
  • ALS 1篇
  • github 2篇
  • 小程序 1篇
  • web接口 2篇
  • 性能测试 1篇
  • web开发 5篇
  • spark优化 1篇

最新评论

  • 基于Spark的FPGrowth(关联规则算法)

    小蓝鼠: 请问模型目录是什么呀,小白不太懂

  • open nsfw封装成接口

    数道难: 我这几天也在弄这块,不过我将源码的部分改造了;然后转存了个PB模型,直接scala/Java调用pb模型即可,比如直接放到Java后台,提供个实时的接口

  • 基于Spark的FPGrowth(关联规则算法)

    Mr.wu`: 提交部署这里就看不懂了,小白怎么办?

  • 基于Spark的Als算法+自迭代+Spark2.0新写法

    鱼摆摆: 竟然敢暴力寻优,资源都是大风刮来的吗

  • 黄图识别-open nsfw

    XerCis: 大佬的站姿很帅

最新文章

  • 设计模式-适配器模式
  • spring mvc的几种使用方式1
  • GBDT和随机森林的区别
2022年1篇
2020年1篇
2017年12篇
2016年13篇
2015年14篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫二哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家云南水果玻璃钢雕塑优势景观玻璃钢雕塑选哪家北京季节性商场美陈怎么样德州玻璃钢室外雕塑岳阳玻璃钢雕塑制作厂家安徽仿铜玻璃钢雕塑多少钱龙岗玻璃钢雕塑厂家商场美陈入口设计晋城广场标识玻璃钢景观雕塑文山市玻璃钢雕塑加工青岛中庭商场美陈天津多彩玻璃钢雕塑批发上海主题商场美陈供货商云南玻璃钢花盆制作江苏季节性商场美陈供应商深圳公园玻璃钢雕塑批发东方玻璃钢雕塑制作厂家永州玻璃钢雕塑制作湖南玻璃钢牛雕塑玻璃钢异形雕塑制作视频植物玻璃钢雕塑生产厂家青岛玻璃钢花盆销售玻璃钢花盆原料玻璃钢人物雕塑生成厂家四川周年庆典商场美陈费用玻璃钢花钵花盆系列雕塑价格河间玻璃钢雕塑烟台玻璃钢雕塑制作深圳玻璃钢雕塑费用是多少金门玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化