燕窝网站怎么做汕头论坛
2026/3/12 9:38:22 网站建设 项目流程
燕窝网站怎么做,汕头论坛,网站体验优化,简单手工1 Elasticsearch 1.1 简介 ES是使用 Java 编写的一种开源搜索引擎#xff0c;它在内部使用 Lucene 做索引与搜索#xff0c;通过对 Lucene 的封装#xff0c;隐藏了 Lucene 的复杂性#xff0c;取而代之的提供一套简单一致的 RESTful API 然而#xff0c;Elasticsearch …1 Elasticsearch1.1 简介ES是使用Java编写的一种开源搜索引擎它在内部使用Lucene做索引与搜索通过对Lucene的封装隐藏了Lucene的复杂性取而代之的提供一套简单一致的RESTful API然而Elasticsearch不仅仅是Lucene并且也不仅仅只是一个全文搜索引擎。它可以被下面这样准确的形容一个分布式的实时文档存储每个字段可以被索引与搜索。一个分布式实时分析搜索引擎。能胜任上百个服务节点的扩展并支持 PB 级别的结构化或者非结构化数据。官网对Elasticsearch的介绍是Elasticsearch是一个分布式、可扩展、近实时的搜索与数据分析引擎。其中主要有如下几个核心术语需要理解词条Term 索引里面最小的存储和查询单元对于英文来说是一个单词对于中文来说一般指分词后的一个词。词典Term Dictionary 或字典是词条Term的集合。搜索引擎的通常索引单位是单词单词词典是由文档集合中出现过的所有单词构成的字符串集合单词词典内每条索引项记载单词本身的一些信息以及指向倒排列表的指针。倒排表Post list一个文档通常由多个词组成倒排表记录的是某个词在哪些文档里出现过以及出现的位置。每条记录称为一个倒排项Posting。倒排表记录的不仅是文档编号还存储了词频等信息。倒排文件Inverted File 所有单词的倒排列表往往顺序地存储在磁盘的某个文件里这个文件被称之为倒排文件倒排文件是存储倒排索引的物理文件由属性值来确定记录的位置的结构就是倒排索引。带有倒排索引的文件称为倒排文件词典和倒排表是Lucene中很重要的两种数据结构是实现快速检索的重要基石。词典和倒排文件是分两部分存储的词典在内存中而倒排文件存储在磁盘上1.2 分片副本映射1.2.1 分片ShardsES支持PB级全文搜索当索引上的数据量太大的时候ES通过水平拆分的方式将一个索引上的数据拆分出来分配到不同的数据块上拆分出来的数据库块称之为一个分片。这类似于MySQL的分库分表只不过MySQL分库分表需要借助第三方组件而ES内部自身实现了此功能。在一个多分片的索引中写入数据时通过路由来确定具体写入哪一个分片中所以在创建索引的时候需要指定分片的数量并且分片的数量一旦确定就不能修改。分片的数量和下面介绍的副本数量都是可以通过创建索引时的Settings来配置ES默认为一个索引创建 5 个主分片, 并分别为每个分片创建一个副本。PUT /myIndex { settings : { number_of_shards : 5, number_of_replicas : 1 } }ES通过分片的功能使得索引在规模上和性能上都得到提升每个分片都是Lucene中的一个索引文件每个分片必须有一个主分片和零到多个副本。1.2.2 副本Replicas副本就是对分片的Copy每个主分片都有一个或多个副本分片当主分片异常时副本可以提供数据的查询等操作。主分片和对应的副本分片是不会在同一个节点上的所以副本分片数的最大值是 N-1其中 N 为节点数。对文档的新建、索引和删除请求都是写操作必须在主分片上面完成之后才能被复制到相关的副本分片。ES为了提高写入的能力这个过程是并发写的同时为了解决并发写的过程中数据冲突的问题ES通过乐观锁的方式控制每个文档都有一个_version 版本号当文档被修改时版本号递增。一旦所有的副本分片都报告写成功才会向协调节点报告成功协调节点向客户端报告成功image.png从上图可以看出为了达到高可用Master节点会避免将主分片和副本分片放在同一个节点上。假设这时节点Node1服务宕机了或者网络不可用了那么主节点上主分片 S0 也就不可用了。幸运的是还存在另外两个节点能正常工作这时ES会重新选举新的主节点而且这两个节点上存在我们所需要的S0的所有数据。我们会将S0的副本分片提升为主分片这个提升主分片的过程是瞬间发生的。此时集群的状态将会为Yellow。为什么我们集群状态是Yellow而不是Green呢虽然我们拥有所有的 2 个主分片但是同时设置了每个主分片需要对应两份副本分片而此时只存在一份副本分片。所以集群不能为Green的状态。如果我们同样关闭了Node2我们的程序依然可以保持在不丢失任何数据的情况下运行因为Node3为每一个分片都保留着一份副本。如果我们重新启动Node1集群可以将缺失的副本分片再次进行分配那么集群的状态又将恢复到原来的正常状态。如果Node1依然拥有着之前的分片它将尝试去重用它们只不过这时Node1节点上的分片不再是主分片而是副本分片了如果期间有更改的数据只需要从主分片上复制修改的数据文件即可。小结将数据分片是为了提高可处理数据的容量和易于进行水平扩展为分片做副本是为了提高集群的稳定性和提高并发量。副本是乘法越多消耗越大但也越保险。分片是除法分片越多单分片数据就越少也越分散。副本越多集群的可用性就越高但是由于每个分片都相当于一个 Lucene 的索引文件会占用一定的文件句柄、内存及 CPU。并且分片间的数据同步也会占用一定的网络带宽所以索引的分片数和副本数也不是越多越好。1.2.3 映射Mapping映射是用于定义ES对索引中字段的存储类型、分词方式和是否存储等信息就像数据库中的Schema描述了文档可能具有的字段或属性、每个字段的数据类型。只不过关系型数据库建表时必须指定字段类型而ES对于字段类型可以不指定然后动态对字段类型猜测也可以在创建索引时具体指定字段的类型。对字段类型根据数据格式自动识别的映射称之为动态映射Dynamic Mapping我们创建索引时具体定义字段类型的映射称之为静态映射或显示映射Explicit Mapping。在讲解动态映射和静态映射的使用前我们先来了解下 ES 中的数据有哪些字段类型之后我们再讲解为什么我们创建索引时需要建立静态映射而不使用动态映射。ESv6.8中字段数据类型主要有以下几类类别数据类型核心类型textkeywordslongintegershortdoubledataboolean复杂类型ObjectNested地理类型geo_pointgeo_shape特殊类型ipcompletiontoken_countjoinText用于索引全文值的字段例如电子邮件正文或产品说明。这些字段是被分词的它们通过分词器传递 以在被索引之前将字符串转换为单个术语的列表。分析过程允许Elasticsearch搜索单个单词中每个完整的文本字段。文本字段不用于排序很少用于聚合。Keyword用于索引结构化内容的字段例如电子邮件地址主机名状态代码邮政编码或标签。它们通常用于过滤排序和聚合。Keyword 字段只能按其确切值进行搜索。通过对字段类型的了解我们知道有些字段需要明确定义的例如某个字段是 Text 类型还是 Keyword 类型差别是很大的时间字段也许我们需要指定它的时间格式还有一些字段我们需要指定特定的分词器等等。如果采用动态映射是不能精确做到这些的自动识别常常会与我们期望的有些差异。所以创建索引的时候一个完整的格式应该是指定分片和副本数以及 Mapping的定义如下PUT my_index { settings : { number_of_shards : 5, number_of_replicas : 1 } mappings: { _doc: { properties: { title: { type: text }, name: { type: text }, age: { type: integer }, created: { type: date, format: strict_date_optional_time||epoch_millis } } } } }1.3 ES机制原理1.3.1 写索引原理下图描述了 3 个节点的集群共拥有 12 个分片其中有 4 个主分片S0、S1、S2、S3和 8 个副本分片R0、R1、R2、R3每个主分片对应两个副本分片节点 1 是主节点Master 节点负责整个集群的状态。image.png写索引是只能写在主分片上然后同步到副本分片。这里有四个主分片一条数据ES是根据什么规则写到特定分片上的呢这条索引数据为什么被写到 S0 上而不写到 S1 或 S2 上那条数据为什么又被写到 S3 上而不写到 S0 上了首先这肯定不会是随机的否则将来要获取文档的时候我们就不知道从何处寻找了。实际上这个过程是根据下面这个公式决定的shard hash(routing) % number_of_primary_shardsRouting是一个可变值默认是文档的_id也可以设置成一个自定义的值。Routing通过Hash函数生成一个数字然后这个数字再除以number_of_primary_shards主分片的数量后得到余数。这个在0到number_of_primary_shards-1之间的余数就是我们所寻求的文档所在分片的位置。这就解释了为什么我们要在创建索引的时候就确定好主分片的数量并且永远不会改变这个数量因为如果数量变化了那么所有之前路由的值都会无效文档也再也找不到了由于在ES集群中每个节点通过上面的计算公式都知道集群中的文档的存放位置所以每个节点都有处理读写请求的能力。在一个写请求被发送到某个节点后该节点即为前面说过的协调节点协调节点会根据路由公式计算出需要写到哪个分片上再将请求转发到该分片的主分片节点上image.png假如此时数据通过路由计算公式取余后得到的值是shardhash(routing)%40则具体流程如下客户端向ES1节点协调节点发送写请求通过路由计算公式得到值为 0则当前数据应被写到主分片 S0 上。ES1节点将请求转发到S0主分片所在的节点 ES3ES3 接受请求并写入到磁盘。并发将数据复制到两个副本分片R0上其中通过乐观并发控制数据的冲突。一旦所有的副本分片都报告成功则节点ES3将向协调节点报告成功协调节点向客户端报告成功。1.3.2 存储原理上面介绍了在ES内部索引的写处理流程这个流程是在ES的内存中执行的数据被分配到特定的分片和副本上之后最终是存储到磁盘上的这样在断电的时候就不会丢失数据。具体的存储路径可在配置文件../config/elasticsearch.yml中进行设置默认存储在安装目录的Data文件夹下。建议不要使用默认值因为若ES进行了升级则有可能导致数据全部丢失path.data: /path/to/data //索引数据 path.logs: /path/to/logs //日志记录1.3.2.1 分段存储索引文档以段的形式存储在磁盘上索引文件被拆分为多个子文件则每个子文件叫作段每一个段本身都是一个倒排索引并且段具有不变性一旦索引的数据被写入硬盘就不可再修改。在底层采用了分段存储模式使它在读写时几乎完全避免了锁的出现大大提升了读写性能。段被写入到磁盘后会生成一个提交点提交点是一个用来记录所有提交后段信息的文件。一个段一旦拥有了提交点就说明这个段只有读的权限失去了写的权限。相反当段在内存中时就只有写的权限而不具备读数据的权限意味着不能被检索。段的概念提出主要是因为在早期全文检索中为整个文档集合建立了一个很大的倒排索引并将其写入磁盘中。如果索引有更新就需要重新全量创建一个索引来替换原来的索引。这种方式在数据量很大时效率很低并且由于创建一次索引的成本很高所以对数据的更新不能过于频繁也就不能保证时效性。索引文件分段存储并且不可修改那么新增、更新和删除如何处理呢新增新增很好处理由于数据是新的所以只需要对当前文档新增一个段就可以了。删除由于不可修改所以对于删除操作不会把文档从旧的段中移除而是通过新增一个.del文件文件中会列出这些被删除文档的段信息。这个被标记删除的文档仍然可以被查询匹配到 但它会在最终结果被返回前从结果集中移除。更新不能修改旧的段来进行反映文档的更新其实更新相当于是删除和新增这两个动作组成。会将旧的文档在.del文件中标记删除然后文档的新版本被索引到一个新的段中。可能两个版本的文档都会被一个查询匹配到但被删除的那个旧版本文档在结果集返回前就会被移除。段被设定为不可修改具有一定的优势也有一定的缺点优势主要表现在不需要锁如果从来不更新索引那就不需要担心多进程同时修改数据的问题。一旦索引被读入内核的文件系统缓存便会留在哪里由于其不变性。只要文件系统缓存中还有足够的空间那么大部分读请求会直接请求内存而不会命中磁盘。这提供了很大的性能提升。其它缓存(像Filter缓存)在索引的生命周期内始终有效。它们不需要在每次数据改变时被重建因为数据不会变化。写入单个大的倒排索引允许数据被压缩减少磁盘I/O和需要被缓存到内存的索引的使用量。段的不变性的缺点如下当对旧数据进行删除时旧数据不会马上被删除而是在.del文件中被标记为删除。而旧数据只能等到段更新时才能被移除这样会造成大量的空间浪费。若有一条数据频繁的更新每次更新都是新增新的标记旧的则会有大量的空间浪费。每次新增数据时都需要新增一个段来存储数据。当段的数量太多时对服务器的资源例如文件句柄的消耗会非常大。在查询的结果中包含所有的结果集需要排除被标记删除的旧数据这增加了查询的负担。1.3.2.2 延迟写策略介绍完了存储的形式那么索引写入到磁盘的过程是怎样的是否是直接调Fsync物理性地写入磁盘答案是显而易见的如果是直接写入到磁盘上磁盘的I/O消耗上会严重影响性能。那么当写数据量大的时候会造成ES停顿卡死查询也无法做到快速响应。如果真是这样ES也就不会称之为近实时全文搜索引擎了。为了提升写的性能ES并没有每新增一条数据就增加一个段到磁盘上而是采用延迟写的策略。每当有新增的数据时就将其先写入到内存中在内存和磁盘之间是文件系统缓存。当达到默认的时间1 秒钟或者内存的数据达到一定量时会触发一次刷新Refresh将内存中的数据生成到一个新的段上并缓存到文件缓存系统 上稍后再被刷新到磁盘中并生成提交点。这里的内存使用的是ES的JVM内存而文件缓存系统使用的是操作系统的内存。新的数据会继续的被写入内存但内存中的数据并不是以段的形式存储的因此不能提供检索功能。由内存刷新到文件缓存系统的时候会生成新的段并将段打开以供搜索使用而不需要等到被刷新到磁盘。在Elasticsearch中写入和打开一个新段的轻量的过程叫做Refresh即内存刷新到文件缓存系统。默认情况下每个分片会每秒自动刷新一次。这就是为什么我们说Elasticsearch是近实时搜索因为文档的变化并不是立即对搜索可见但会在一秒之内变为可见。我们也可以手动触发RefreshPOST /_refresh刷新所有索引POST /nba/_refresh刷新指定的索引。注意尽管刷新是比提交轻量很多的操作它还是会有性能开销。当写测试的时候 手动刷新很有用但是不要在生产环境下每次索引一个文档都去手动刷新。而且并不是所有的情况都需要每秒刷新。假如正在使用Elasticsearch索引大量的日志文件 想优化索引速度而不是近实时搜索。这时可以在创建索引时在Settings中通过调大refresh_interval 30s的值 降低每个索引的刷新频率设值时需要注意后面带上时间单位否则默认是毫秒。当refresh_interval-1时表示关闭索引的自动刷新。虽然通过延时写的策略可以减少数据往磁盘上写的次数并提升了整体的写入能力但是我们知道文件缓存系统也是内存空间属于操作系统的内存只要是内存都存在断电或异常情况下丢失数据的危险。为了避免丢失数据Elasticsearch添加了事务日志Translog事务日志记录了所有还没有持久化到磁盘的数据image.png添加了事务日志后整个写索引的流程如上图所示一个新文档被索引之后先被写入到内存中但是为了防止数据的丢失会追加一份数据到事务日志中。不断有新的文档被写入到内存同时也都会记录到事务日志中。这时新数据还不能被检索和查询。当达到默认的刷新时间或内存中的数据达到一定量后会触发一次Refresh将内存中的数据以一个新段形式刷新到文件缓存系统中并清空内存。这时虽然新段未被提交到磁盘但是可以提供文档的检索功能且不能被修改。随着新文档索引不断被写入当日志数据大小超过512M或者时间超过 30 分钟时会触发一次Flush内存中的数据被写入到一个新段同时被写入到文件缓存系统文件系统缓存中数据通过Fsync刷新到磁盘中生成提交点日志文件被删除创建一个空的新日志。通过这种方式当断电或需要重启时ES不仅要根据提交点去加载已经持久化过的段还需要工具Translog里的记录把未持久化的数据重新持久化到磁盘上避免了数据丢失的可能。1.3.2.3 段合并由于自动刷新流程每秒会创建一个新的段 这样会导致短时间内的段数量暴增。而段数目太多会带来较大的麻烦。每一个段都会消耗文件句柄、内存和 CPU 运行周期。更重要的是每个搜索请求都必须轮流检查每个段然后合并查询结果所以段越多搜索也就越慢。Elasticsearch通过在后台定期进行段合并来解决这个问题。小的段被合并到大的段然后这些大的段再被合并到更大的段。段合并的时候会将那些旧的已删除文档从文件系统中清除。被删除的文档不会被拷贝到新的大段中。合并的过程中不会中断索引和搜索。image.png段合并在进行索引和搜索时会自动进行合并进程选择一小部分大小相似的段并且在后台将它们合并到更大的段中这些段既可以是未提交的也可以是已提交的合并结束后老的段会被删除新的段被Flush到磁盘同时写入一个包含新段且排除旧的和较小的段的新提交点新的段被打开可以用来搜索。段合并的计算量庞大 而且还要吃掉大量磁盘 I/O段合并会拖累写入速率如果任其发展会影响搜索性能。Elasticsearch在默认情况下会对合并流程进行资源限制所以搜索仍然有足够的资源很好地执行。1.4 性能优化1.4.1 存储设备磁盘在现代服务器上通常都是瓶颈。Elasticsearch重度使用磁盘磁盘能处理的吞吐量越大节点就越稳定。这里有一些优化磁盘 I/O 的技巧使用 SSD。比机械磁盘优秀多了。使用 RAID 0。条带化 RAID 会提高磁盘 I/O代价显然就是当一块硬盘故障时整个就故障了。不要使用镜像或者奇偶校验 RAID 因为副本已经提供了这个功能。使用多块硬盘并允许Elasticsearch通过多个path.data目录配置把数据条带化分配到它们上面。不要使用远程挂载的存储比如 NFS 或者 SMB/CIFS。这个引入的延迟对性能来说完全是背道而驰的。1.4.2 内部索引优化image.pngElasticsearch为了能快速找到某个Term先将所有的Term排个序然后根据二分法查找Term时间复杂度为logN就像通过字典查找一样这就是Term Dictionary。现在再看起来似乎和传统数据库通过B-Tree的方式类似。但是如果 Term 太多Term Dictionary也会很大放内存不现实于是有了Term Index。就像字典里的索引页一样A 开头的有哪些 Term分别在哪页可以理解Term Index是一棵树。这棵树不会包含所有的Term它包含的是Term的一些前缀。通过Term Index可以快速地定位到Term Dictionary的某个Offset然后从这个位置再往后顺序查找。在内存中用FST方式压缩Term IndexFST以字节的方式存储所有的Term这种压缩方式可以有效的缩减存储空间使得Term Index足以放进内存但这种方式也会导致查找时需要更多的 CPU 资源。对于存储在磁盘上的倒排表同样也采用了压缩技术减少存储所占用的空间。1.4.3 调整配置参数调整配置参数建议如下给每个文档指定有序的具有压缩良好的序列模式 ID避免随机的UUID-4这样的 ID这样的 ID 压缩比很低会明显拖慢 Lucene。对于那些不需要聚合和排序的索引字段禁用Doc values。Doc Values是有序的基于documentfield value的映射列表。不需要做模糊检索的字段使用Keyword类型代替 Text 类型这样可以避免在建立索引前对这些文本进行分词。如果搜索结果不需要近实时的准确度考虑把每个索引的index.refresh_interval改到30s如果在做大批量导入导入期间可以通过设置这个值为-1关掉刷新还可以通过设置index.number_of_replicas: 0关闭副本。别忘记在完工的时候重新开启它。避免深度分页查询建议使用Scroll进行分页查询。普通分页查询时会创建一个fromsize的空优先队列每个分片会返回fromsize条数据默认只包含文档 ID 和得分 Score 给协调节点。如果有 N 个分片则协调节点再对fromsize×n条数据进行二次排序然后选择需要被取回的文档。当from很大时排序过程会变得很沉重占用 CPU 资源严重。减少映射字段只提供需要检索聚合或排序的字段。其他字段可存在其他存储设备上例如 Hbase在 ES 中得到结果后再去 Hbase 查询这些字段。创建索引和查询时指定路由Routing值这样可以精确到具体的分片查询提升查询效率。路由的选择需要注意数据的分布均衡。1.5 与关系型数据库联系1.5.1 与SQL发展众所周知Elasticsearch是一个基于Apache Lucene的Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。Elasticsearch是一种NoSQL数据库非关系型数据库和常规的关系型数据库比如MySQLOralce等的基本概念对应关系如下Elasticsearchindex -- type -- doc -- fieldMySQL数据库 -- 数据表 -- 行 -- 列因为关系型数据库比非关系型数据库的概念提出的早而且很成熟应用广泛。所以后来很多NoSQL包括MongoDBElasticsearch等都参考并延用了传统关系型数据库的基本概念。1.5.2 ES去除表 type一个客观的现象和事实是Elasticsearch官网提出的近期版本对type概念的演变情况如下在5.X版本中一个 index 下可以创建多个 type在6.X版本中一个 index 下只能存在一个 type在7.X版本中直接去除了 type 的概念就是说 index 不再会有 type。为何要去除 type 的概念为何不是在 6.X 版本开始就直接去除 type而是要逐步去除type为何要去除 type 的概念因为Elasticsearch设计初期是直接查考了关系型数据库的设计模式存在了type数据表的概念。但是其搜索引擎是基于Lucene的这种 “基因”决定了type是多余的。Lucene的全文检索功能之所以快是因为倒序索引的存在。而这种倒序索引的生成是基于index的而并非type。多个type反而会减慢搜索的速度。为了保持Elasticsearch一切为了搜索 的宗旨适当的做些改变去除 type也是无可厚非的也是值得的。为何不是在 6.X 版本开始就直接去除 type而是要逐步去除type因为历史原因前期Elasticsearch支持一个index下存在多个type的而且有很多项目在使用Elasticsearch作为数据库。如果直接去除 type 的概念不仅是很多应用Elasticsearch的项目将面临 业务、功能和代码的大改而且对于Elasticsearch官方来说也是一个巨大的挑战这个是伤筋动骨的大手术很多涉及到type源码是要修改的。所以权衡利弊采取逐步过渡的方式最终推迟到7.X版本才完成去除 type这个 革命性的变革。AI大模型学习福利作为一名热心肠的互联网老兵我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。一、全套AGI大模型学习路线AI大模型时代的学习之旅从基础到前沿掌握人工智能的核心技能因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取二、640套AI大模型报告合集这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获三、AI大模型经典PDF籍随着人工智能技术的飞速发展AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型如GPT-3、BERT、XLNet等以其强大的语言理解和生成能力正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获四、AI大模型商业化落地方案因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获作为普通人入局大模型时代需要持续学习和实践不断提高自己的技能和认知水平同时也需要有责任感和伦理意识为人工智能的健康发展贡献力量

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询