Elasticsearch,从一个浪漫的故事开始(原理篇)

「Elasticsearch + Lucene」搜索引擎的架构、倒排索引和搜索过程 从一个浪漫的故事开始 许多年前,一个名叫Shay Banon的开发者,带着新婚妻子去伦敦生活,在得知妻子想从事厨师工作后,准备利用自己所学为妻子开发一个食谱搜索引擎,他开始使用Lucene的一个早期版本。但是尝试之后,他发现直接使用Lucene给没有任何开发经验的妻子而言是非常困难的,因此Shay 开始对Lucene进行封装。不久他发布了他的第一个基于Lucene的用java编写的开... 阅读详情

微信公众号:大数据左右手
专注于大数据技术,人工智能和编程语言
个人既可码代码也可以码文字。欢迎转发与关注

从一个浪漫的故事开始

许多年前,一个名叫Shay Banon的开发者,带着新婚妻子去伦敦生活,在得知妻子想从事厨师工作后,准备利用自己所学为妻子开发一个食谱搜索引擎,他开始使用Lucene的一个早期版本。
但是尝试之后,他发现直接使用Lucene给没有任何开发经验的妻子而言是非常困难的,因此Shay 开始对Lucene进行封装。不久他发布了他的第一个基于Lucene的用java编写的开源项目 Compass。
后来Shay找到了一份跟高性能和分布式有关的工作,然后发现这份工作对实时、分布式搜索引擎的需求尤为突出,于是他决定重写Compass,把它变为一个独立的服务并取名Elasticsearch,再到后来Elasticsearch发布了第一个公开版本,从此以后,Elasticsearch已经成为了 Github 上最活跃的开源项目之一。
据说,Shay的妻子还在等着她的食谱搜索引擎,而他已经在大公司忙的“一发不可收拾”…

浪漫的故事开启了技术的起飞 。。。

那有人会问这个创始人Shay为什么使用的是Apache Lucene而不是再自己开发一个全文搜索库。对于这个问题,猜想是因为Lucene比较成熟,高性能,可扩展,轻量级以及强大的功能。Lucene内核可以创建为单个Java库文件,并且不依赖第三方代码,用户可以使用它提供的各种所见即所得的全文检索功能进行索引和搜索操作。当然,Lucene还有很多扩展,它们提供了各种各样的功能,例如多语言处理、拼写检查、高亮显示等。如果不需要这些额外的特性,可以下载单个的Lucene core库文件,直接在应用程序中使用它

Apache Lucene的架构与索引和搜索过程

架构图

Lucene个个组件

  1. 被索引的文档用Document对象表示

  2. IndexWriter通过函数addDocument将文档添加到索引中,实现创建索引的过程

  3. Lucene的索引是反向索引

  4. 当用户查询请求时,Query代表用户查询语句

  5. IndexSearcher通过函数search搜索Lucene Index

  6. IndexSearcher计算Term Weight和Score并且将结果返回给用户

  7. 返回给用户的文档集合用TopDocsCollector表示

索引创建过程如下

  1. 创建一个IndexWriter用来写索引文件,它有几个参数,INDEX_DIR就是索引文件存放的位置,Analyzer便是用来对文档进行分析和语言处理的分词器。

  2. 创建一个Document代表我们要索引的文档。

  3. 将不同的Field加入到文档中。我们知道,一篇文档有多种信息,如题目、作者、内容、修改时间等。不同类型的信息用不同的Field来表示,在本例中,一共有两类信息进行了索引,一个是文件路径path,一个是文件内容contents。其中FileReader的SRC_FILE就表示要索引的源文件。

  4. IndexWriter调用函数addDocument将索引写入到索引文件夹中

搜索过程如下

  1. IndexReader将磁盘上的索引信息读入到内存,INDEX_DIR就是索引文件存放的位置。

  2. 创建IndexSearch准备进行搜索。

  3. 创建Analyer用来对查询语句进行词法分析和语言处理。

  4. 创建QueryParser用来对查询语句进行语法分析。

  5. QueryParser调用parser进行语法分析,形成查询语法树,放到Query中。

  6. IndexSearcher调用search对查询语法树Query进行搜索,得到结果TopScoreDocCollector

Elasticsearch架构图与介绍

  1. Gateway代表ElasticSearch索引的持久化存储方式。
    在Gateway中,ElasticSearch默认先把索引存储在内存中,然后当内存满的时候,再持久化到Gateway里。当ES集群关闭或重启的时候,它就会从Gateway里去读取索引数据。比如LocalFileSystem和HDFS、AS3等。

  2. DistributedLucene Directory,它是Lucene里的一些列索引文件组成的目录。它负责管理这些索引文件。包括数据的读取、写入,以及索引的添加和合并等。

  3. River,代表是数据源。是以插件的形式存在于ElasticSearch中。 

  4. Mapping,映射的意思,非常类似于静态语言中的数据类型。比如我们声明一个int类型的变量,那以后这个变量只能存储int类型的数据。比如我们声明一个double类型的mapping字段,则只能存储double类型的数据。Mapping不仅是告诉ElasticSearch,哪个字段是哪种类型。还能告诉ElasticSearch如何来索引数据,以及数据是否被索引到等。

  5. Index Moudle,Elasticsearch里的索引概念是名词而不是动词,在elasticsearch里它支持多个索引。
    优点类似于关系数据库里面每一个服务器可以支持多个数据库是一个道理,在每一索引下面又可以支持多种类型,这又类似于关系数据库里面的一个数据库可以有多张表一样。
    但是本质上和关系数据库还是有很大的区别,我们这里暂时可以这么理解

  6. Search Module,搜索查询模块。

  7. Disvcovery,主要是负责集群的master节点发现。比如某个节点突然离开或进来的情况,进行一个分片重新分片等。这里有个发现机制。发现机制默认的实现方式是单播和多播的形式,即Zen,同时也支持点对点的实现。另外一种是以插件的形式,即EC2。

  8. Scripting,即脚本语言。包括很多,这里不多赘述。如mvel、js、python等。

  9. Transport,代表ElasticSearch内部节点,代表跟集群的客户端交互。包括Thrift、Memcached、Http等协议

  10. RESTful Style API,通过RESTful方式来实现API编程。

  11. 3rd plugins,代表第三方插件。

  12. Java(Netty),是开发框架。

  13. JMX,是监控。

Elasticsearch核心概念

  1. 索引 Index
    ES中的索引类似关系型数据库中的数据库,里面存放用户文档数据。因为ES是封装的Lucene,所以底层还是有Lucene的一个或者多个索引组成,数据的增删改查也是有底层的Lucene完成,ES中的分片或副本实际上就是一个Lucene索引。

  2. 文档 Document
    文档是ES中存储数据的主体,ES中所有的操作都是建立在文档的基础上的,每个文档都是由各种Field组成,每个Field有一个名称和一个或多个值构成。文档展示给用户就是一个JSON对象。

  3. 类型 Type
    ES中Type是一种逻辑上的概念,类似关系型数据库中的表,每个文档都属于某一种类型,如果没有定义,会有默认值,这里的类型相当于数据库当中的表,ES的每个索引可以包含多种类型。

  4. 映射 Mapping
    映射类似关系型数据库中的schema,用于定义field的属性,如字段类型,是否分词等。这里有一点和关系型数据库不同的是ES会在用户没有定义字段属性的情况下,自动嗅探该字段的类型进行自动识别。

  5. 集群 Cluster
    多个ES节点工作在一起组成一个集群。ES对于集群的支持几乎是无缝的,这也是ES重要的竞争优点之一。

  6. 节点 Node
    一个ES实例就是一个节点,说的再简单点,一台部署了ES服务的机器就是一个节点,同时,一台机器如果硬件资源允许也可以同时启动多个ES实例。ES中每个节点都和集群(如果是多个节点的集群)中的其他节点相互通信,了解所有文档的存储位置并能转发用户的请求到对应的数据节点上。

  7. 分片 Shard
    因为ES是分布式架构,类似于HDFS的存储方式,所以数据被打散存储在集群的多个节点上,一个分片实际上就是底层Lucene的一个索引,这里说的分片指的是ES中的主分片(因为还有副本分片一说),分片的方式是ES自动完成,用户可以指定分片的数量,主分片一旦指定就不能修改,因为ES打散数据的方式是和索引创建时指定的主分片数量有关(参考公式:shard = hash(routting) % number_of_primary_shards进行文档分配),后期改变会导致分片中的数据不可搜索。

  8. 副本 Replia
    副本就是分片的一个拷贝,不仅能提高自身容灾,另外,请求量很大的情况下,副本可以分担主Shard压力,承担查询功能。副本个数还以在创建完索引后灵活调整

实现原理分析

  1. write(写) and create(创建)操作实现原理

     

    1)先写入buffer,在buffer里的时候数据是搜索不到的;同时将数据写入translog日志文件

    2)如果buffer快满了,或者到一定时间,就会将buffer数据refresh到一个新的segment file中,但是此时数据不是直接进入segment file的磁盘文件的,而是先进入os cache的。这个过程就是refresh。
    每隔1秒钟,es将buffer中的数据写入一个新的segment file,每秒钟会产生一个新的磁盘文件,segment file,这个segment file中就存储最近1秒内buffer中写入的数据,但是如果buffer里面此时没有数据,那当然不会执行refresh操作咯,每秒创建换一个空的segment file,如果buffer里面有数据,默认1秒钟执行一次refresh操作,刷入一个新的segment file中,操作系统里面,磁盘文件其实都有一个东西,叫做os cache,操作系统缓存,就是说数据写入磁盘文件之前,会先进入os cache,先进入操作系统级别的一个内存缓存中去,只要buffer中的数据被refresh操作,刷入os cache中,就代表这个数据就可以被搜索到了
    为什么叫es是准实时的?NRT,near real-time,准实时。默认是每隔1秒refresh一次的,所以es是准实时的,因为写入的数据1秒之后才能被看到。
    可以通过es的restful api或者java api,手动执行一次refresh操作,就是手动将buffer中的数据刷入os cache中,让数据立马就可以被搜索到。
    只要数据被输入os cache中,buffer就会被清空了,因为不需要保留buffer了,数据在translog里面已经持久化到磁盘去一份了

    3)只要数据进入os cache,此时就可以让这个segment file的数据对外提供搜索了

    4)重复1~3步骤,新的数据不断进入buffer和translog,不断将buffer数据写入一个又一个新的segment file中去,每次refresh完buffer清空,translog保留。随着这个过程推进,translog会变得越来越大。当translog达到一定长度的时候,就会触发commit操作。
    buffer中的数据,倒是好,每隔1秒就被刷到os cache中去,然后这个buffer就被清空了。所以说这个buffer的数据始终是可以保持住不会填满es进程的内存的。
    每次一条数据写入buffer,同时会写入一条日志到translog日志文件中去,所以这个translog日志文件是不断变大的,当translog日志文件大到一定程度的时候,就会执行commit操作。

    5)commit操作发生第一步,就是将buffer中现有数据refresh到os cache中去,清空buffer

    6)将一个commit point写入磁盘文件,里面标识着这个commit point对应的所有segment file

    7)强行将os cache中目前所有的数据都fsync到磁盘文件中去
    ranslog日志文件的作用是什么?就是在你执行commit操作之前,数据要么是停留在buffer中,要么是停留在os cache中,无论是buffer还是os cache都是内存,一旦这台机器死了,内存中的数据就全丢了。
    所以需要将数据对应的操作写入一个专门的日志文件,translog日志文件中,一旦此时机器宕机,再次重启的时候,es会自动读取translog日志文件中的数据,恢复到内存buffer和os cache中去。

    8)将现有的translog清空,然后再次重启启用一个translog,此时commit操作完成。默认每隔30分钟会自动执行一次commit,但是如果translog过大,也会触发commit。整个commit的过程,叫做flush操作。我们可以手动执行flush操作,就是将所有os cache数据刷到磁盘文件中去。
    不叫做commit操作,flush操作。es中的flush操作,就对应着commit的全过程。我们也可以通过es api,手动执行flush操作,手动将os cache中的数据fsync强刷到磁盘上去,记录一个commit point,清空translog日志文件。

    9)translog其实也是先写入os cache的,默认每隔5秒刷一次到磁盘中去,所以默认情况下,可能有5秒的数据会仅仅停留在buffer或者translog文件的os cache中,如果此时机器挂了,会丢失5秒钟的数据。但是这样性能比较好,最多丢5秒的数据。也可以将translog设置成每次写操作必须是直接fsync到磁盘,但是性能会差很多。

    10)buffer每次refresh一次,就会产生一个segment file,所以默认情况下是1秒钟一个segment file,segment file会越来越多,此时会定期执行merge

    11)每次merge的时候,会将多个segment file合并成一个,同时这里会将标识为deleted的doc给物理删除掉,然后将新的segment file写入磁盘,这里会写一个commit point,标识所有新的segment file,然后打开segment file供搜索使用,同时删除旧的segment file。

  2. Update和Delete实现原理
    删除和更新操作也是写操作。但是,Elasticsearch中的文档是不可变的(immutable),因此不能删除或修改。那么,如何删除/更新文档呢?
    磁盘上的每个分段(segment)都有一个.del文件与它相关联。当发送删除请求时,该文档未被真正删除,而是在.del文件中标记为已删除。此文档可能仍然能被搜索到,但会从结果中过滤掉。当分段合并时(我们将在后续的帖子中包括段合并),在.del文件中标记为已删除的文档不会被包括在新的合并段中。
    现在,我们来看看更新是如何工作的。创建新文档时,Elasticsearch将为该文档分配一个版本号。对文档的每次更改都会产生一个新的版本号。当执行更新时,旧版本在.del文件中被标记为已删除,并且新版本在新的分段中编入索引。旧版本可能仍然与搜索查询匹配,但是从结果中将其过滤掉。

  3. Read:查询阶段(Query Phase)

    下面是详细流程图

    简单描述:
    查询,GET某一条数据,写入了某个document,这个document会自动给你分配一个全局唯一的id,doc id,同时也是根据doc id进行hash路由到对应的primary shard上面去。也可以手动指定doc id,比如用订单id,用户id。
    你可以通过doc id来查询,会根据doc id进行hash,判断出来当时把doc id分配到了哪个shard上面去,从那个shard去查询
    1)客户端发送请求到任意一个node,成为coordinate node
    2)coordinate node对document进行路由,将请求转发到对应的node,此时会使用round-robin随机轮询算法,在primary          shard以及其所有replica中随机选择一个,让读请求负载均衡
    3)接收请求的node返回document给coordinate node
    4)coordinate node返回document给客户端

  4. es搜索数据过程(底层倒排索引,后面讲)
    1)客户端发送请求到一个coordinate node
    2)协调节点将搜索请求转发到所有的shard对应的primary shard或replica shard也可以
    3)query phase:每个shard将自己的搜索结果(其实就是一些doc id),返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果
    4)fetch phase:接着由协调节点,根据doc id去各个节点上拉取实际的document数据,最终返回给客户端

这篇文章只是Elasticsearch的入门和原理,是不是看文字很枯燥,后期后安排新颖的内容呈现给大家

Elasticsearch学习未完待续 ……欢迎继续关注

微信公众号:大数据左右手
人要去的地方,除了远方,还有未来
欢迎关注我,一起学习,一起进步!

程序员浪漫表白网页开发实战项目 这是一封用代码写成的情书 阅读详情

相关推荐

程序员浪漫表白网页设计与开发实战项目

我们聊了 HTML 结构、CSS 动画、JS 交互、Canvas 粒子、Three.js 3D、响应式适配、自动化部署……技术细节一大堆。但别忘了,这一切的终点,不是一个“炫技作品”,而是一颗真心。最好的前端工程师,不是写出最复杂的代码,而是用技术降低情感表达的门槛。当你按下回车键提交最后一行的时候,希望你知道:有些 bug 可以修复,有些 commit 可以 revert,但有些人,一旦错过就不再。所以,别等了。打开编辑器,写一封属于你们的。

weixin_29363791的博客 1036

Elasticsearch简史:源自给老婆开发烹饪App

作者 | Diana Kupfer译者 | 张健欣策划 | 万佳原文链接:https://jaxenter.com/elasticsearch-founder-interview...

架构师小秘圈 510

我为爱人定制的浪漫HTML网页礼物(可下载修改)

我们写了这么多代码,用了这么多技术,但最终的目的,不是炫技,而是让爱被更好地表达。当你写下,你不是在定义动画,而是在模拟心跳。当你设置,你不是在填颜色,而是在描绘感情的升温曲线。当你用 JS 检测日期,你不是在写逻辑,而是在准备一个惊喜。技术,从来不是冰冷的工具。当你赋予它温度,它就会成为最动人的语言。所以,别再问“HTML 能做什么”了。去问:“我想说什么?然后,让代码帮你写一封,会呼吸的情书 💖本文还有配套的精品资源,点击获取。

weixin_42620563的博客 1398

ElasticSearch基础:从倒排索引说起,快速认知ES

下载 下载地址:https://www.elastic.co/cn/downloads/elasticsearch 安装: 1、将压缩包上传到linux服务器 2、解压压缩包:tar -zxvf elasticsearch-7.13.2-linux-x86_64.tar.gz es 目录介绍 bin:可执行文件在里面,运行es的命令就在这个里面,包含了一些脚本文件等 config:配置文件目录 JDK:java环境 lib:依赖的jar,类库 logs:日志文件 modules:es相关的模块 plug

云深不知处 6989

七夕表白网页源码合集:8个浪漫HTML+CSS+JS实战项目

技术讲完了,但我们还没结束。真正的高手,懂得如何把一套复杂的源码,变成别人也能轻松定制的作品。为此,我整理了 8 套不同风格的表白页模板,每一套都有明确的定位:模板编号技术亮点适用场景动画强度开发难度1纯CSS心跳动画快速部署★★☆☆☆★☆☆☆☆2Canvas粒子系统高互动性★★★★★★★★★☆3视频背景+字幕滚动纪念日回顾★★★☆☆★★☆☆☆4时间轴故事展示。

weixin_35006125的博客 1068

Elasticsearch 架构图

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。 我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch来解决所有这些问题及可能出现的更多其它问题。 架构图方便理解Elasticsearch

一篇文章带你了解Elasticsearch的故事

许多年前,一个刚结婚的名叫 Shay Banon 的失业开发者,跟着他的妻子去了伦敦,他的妻子在那里学习厨师。在寻找一个赚钱的工作的时候,为了给他的妻子做一个食谱搜索引擎,他开始使用 Lucene 的一个早期版本。这个对于高性能,实时,分布式搜索引擎的需求尤为突出,他决定重写 Compass,把它变为一个独立的服务并取名 Elasticsearch。据说,Shay 的妻子还在等着她的食谱搜索引擎,而 Elasticsearch 后来作为一家公司(Elastic 公司)进行运作,定位为数据搜索和分析平台。

Java高知社区 523

利用docx4j与docx4j-ImportXHTML高效实现HTML到Word的自动化转换

本文详细介绍了如何利用docx4j与docx4j-ImportXHTML库,在Java环境中高效实现HTML到Word文档的自动化转换。内容涵盖从环境搭建、核心依赖配置,到集成Spring Boot REST API的完整实战流程,并深入解析了处理图片、CSS样式、字体设置以及使用模板保证样式统一等高级技巧与常见问题解决方案,帮助开发者构建稳定的文档自动化生成流水线。

cnn8visionary的博客 366

分布式搜索引擎的架构是怎么设计的(es是如何实现分布式的啊)?为啥是分布式的?

1231313

不良IP的博客 989

PHP服务端 苹果支付(IAP)处理

公司做的app需要做IAP订阅支付,开始觉得和微信的支付流程差不多,做起来还是有点麻烦,主要是网上的文章很少,不能拿来主义。自己做完总结一下,希望对小伙伴们有帮助我就很欣慰了。代码写的不好 不要喷我。。。 首先讲一下我的业务逻辑,也就是php服务端需要做什么事情。 先上图: 下面我详细的讲一下每...

山水的博客 1万+

电子设计实战:用MOS管手把手搭建D触发器电路(含时序分析避坑指南)

本文详细介绍了如何使用MOS管从零开始搭建D触发器电路,重点解析了建立时间和保持时间等关键时序参数对电路稳定性的影响。通过实测波形分析和避坑指南,帮助电子工程师掌握D触发器的实际搭建技巧与优化方法,提升数字电路设计的可靠性。

x1y2z的博客 1163

科普文:深入理解ElasticSearch体系结构

es自带如下的分词器StandardSimpleWhitespaceStopKeywordPatternLanguage默认分词器其组成如下,特性为:按词切分,支持多语言小写处理其组成如下,特性为:按照非字母切分小写处理其组成如下,特性为:按照空格切分Stop Word指语气助词等修饰性的词语,比如the、an、的、这等等其组成如图,特性为:相比Simple Analyzer多了stop Word处理。

为无为,事无事,味无味。 5397

深入理解HanLP1.x,填平可能遇到的坑

提取指定数量的摘要。自定义词典为什么要单独领出来讲呢?因为在我们的业务开发中,可能分词的效果并不理想,需要定制自己的词库,索引更加常用。例如:小米su7特斯拉modelY比亚042025款6575767670908我们需要分出小米su72025款等词。我们分别看看用字典和不用字典的效果。

static_coder的博客 980

java浪漫代码_Elasticsearch,从一个浪漫的故事开始(原理篇)

微信公众号:王了个博专注于大数据技术,人工智能和编程语言个人既可码代码也可以码文字。欢迎转发与关注从一个浪漫的故事开始许多年前,一个名叫Shay Banon的开发者,带着新婚妻子去伦敦生活,在得知妻子想从事厨师工作后,准备利用自己所学为妻子开发一个食谱搜索引擎,他开始使用Lucene的一个早期版本。但是尝试之后,他发现直接使用Lucene给没有任何开发经验的妻子而言是非常困难的,因此Sh...

weixin_39649405的博客 253

LittleFS+NANDFLASH软硬件配置详情

littleFS文件系统说明及移植过程

weixin_43200844的博客 2368

两轮差速机器人运动学模型

两轮差速底盘 1.1、底盘说明 两轮差速底盘由两个动力轮位于底盘左右两侧,两轮独立控制速度,通过给定不同速度实现底盘转向控制。一般会配有一到两个辅助支撑的万向轮。 主要底盘有: 1、Turtlebot; 2、扫地机器人; 3、无人仓AGV小车; 4、轮椅; 底盘主要特点: 1、控制简单、里程计计算简单。 2、只能给定X方向速度、Z轴方向角速度。 1.2、底盘运动学分析 1.2.1、底盘模型 图1.2.1 常见的两轮差速底盘模型 1.2.2、机器人本身约束方程(物理特性) 图1.2.2 a 左侧是车的两个

su_fei_ma_su的博客 3万+

小红帽的故事居然是从法国民间的一个狼人诱奸小女孩的故事改来的

 这个故事是由故事大王查尔斯.佩诺尔特讲的,是一个很灰暗的、有性刺激因素和告诫作用的故事,讲的是一个天真的处女被一些狼诱奸。   佩诺尔特在故事的结尾,把他自己的观点说得很明白:“人们经常看到,一些小孩子——特别是一些脸蛋生得很漂亮,身材也很好看的姑娘——她们总是不小心,什么人说的话她们都信。”他还说:“最危险的狼,就是那种文质彬彬、温柔浪漫和模样可爱的狼……这些狼喜欢在家里接待女士,也喜欢在街...

weixin_33722405的博客 2096

YOLOv11改进策略【Head/分割头】| 结合CVPR-2024 中的DynamicConv 动态卷积 改进分割头, 优化模型(独家改进)

在大规模视觉预训练中,通常模型的性能受到数据、参数和FLOP三个关键因素的影响。一般来说,模型的参数数量越多,FLOP也越高,但在移动设备等对计算资源有限制的场景下,需要低FLOP的模型同时又希望模型能从大规模预训练中受益。传统的方法很难在增加参数的同时保持低FLOP,因此需要一种新的设计来解决这个问题,模块应运而生。

Limiiiing的博客 2312

浪漫表白网页HTMlJSCSS:打造独特浪漫表白场景

浪漫表白网页HTMlJSCSS:打造独特浪漫表白场景 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在这个信息爆炸的时代,表白的方式也层出不穷。浪漫表白网页HTMlJSCSS 旨在为用户打造一个充满创意与浪漫的表白场景。通过简单的前端技术,让每个人都能根据自己的需求,定制出一个独一无二的表白网页,让爱情表白更加动人。 项目技术分析 浪漫表白网页HTMlJSCSS 是一...

gitblog_06754的博客 796

LLM Wiki 的完整输入体系:LLM Wiki极简实战

LLM Wiki 的输入分为**四大类**,覆盖从"原始知识注入"到"系统行为控制"的全流程,所有输入都遵循"**原始资料不可变,规则可迭代,人类反馈闭环**"的核心原则。

ZhangJiqun&191cm&85kg 326

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

热门搜索引擎ElasticSearch——总述(一)

背 景   用着MySQL,MongonDB等查询他不香吗?为啥要去搞这个ElasticSearch,这不是找虐吗?其实ElasticSearch盛行的原因有以下几点; 海量数据查询时,MySQL性能确实有瓶颈,不能做到毫秒级别的实时相应; 查询条件手残输入错误,MySQL极有可能查不到数据,ElasticSearch因为支持分词器,依然可以快速查询到结果,如我本来想买个热水壶,但是我输入时抖了下,写成了水壶热,MySQL可能就没有返回结果了,ElasticSearch可以有,原理后续解说。 支持搜索的关

LXWalaz1s1s的博客 662

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SmallRomance:程序员专属的浪漫告白神器 - 5分钟打造个性化浪漫网页

还在为如何向心仪的人表达爱意而烦恼吗?💕 想让你的告白既浪漫又有技术范儿吗?SmallRomance就是为你量身打造的**程序员专属浪漫告白神器**!这个基于HTML5 Canvas的开源项目,让你能在短短5分钟内创建一个充满惊喜的个性化浪漫网页,通过精美的动画效果传达你的心意。 ## ✨ 项目亮点:为什么选择SmallRomance? SmallRomance是一个专为程序员设计的**浪漫

gitblog_00349的博客 1070

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

程序员的浪漫七夕

程序员的浪漫七夕

日常笔记 | 干货分享 | 毕设源码 | 毕设指导 | 答辩指导 929

七夕到了 —— 属于 Java 的浪漫,拿去吧~ 祝表白成功

利用睡眠方法动态打印一个 Java 心形!

燃吹 U 客帮 923

c++primer plus看完看什么_法语电影里的浪漫,你都看懂了吗?

许多人谈到法国,就会想到“浪漫”这个词语不少法国人也将浪漫写进了法国电影今天,小编就带大家一起来看看,法国电影中那些浪漫的台词·Paris, je t'aime·《巴黎我爱你》该片场景设在巴黎,由18个故事组成,围绕巴黎20个区,有关爱情、亲情、友情,以及人性。-Je peux te masser les pieds ?-我能揉揉你的脚吗?-Pourquoi je te laissera...

weixin_39673293的博客 716

你知道搜索是怎样的一个原理吗?对话形式通俗易懂

不管你是做计算机技术的,还是其他工作岗位的,我相信你都能看懂,可以算是一个老少皆宜的文章,来吧,多学习没坏处

悦上心灵的博客 470
上一篇: 你知道搜索是怎样的一个原理吗?对话形式通俗易懂
下一篇: hive on spark引擎编译与测试
大数据左右手
博客等级 码龄9年 475粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值