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

让chatGPT当我的老师如何? 通过和chatGPT交互式学习,了解在ES中,一条JSON数据是如何写到磁盘上的

  最近一直有一个问题,如鲠在喉。争取早一天解决,早一天踏踏实实的睡觉。

  问题是:在ES中,一条JSON数据是如何写入到磁盘上的?

  如何解决这个问题?我想到了chatGPT,还有lucene的学习资料。这篇文章,我打算用 QA的形式来分享这次学习探索过程,看看能否驯服chatGPT当我的老师。

  文章我copy了我和chatGPT的聊天记录。

  最后的结果还是挺不错的,虽然也有一些问题,但是大多数是对的。并且chatGPT也给列出来了ES中这部分源码的实现位置,只需要再花时间看看源码,答案就有了。

Q1.1 在ES中,一条JSON数据是如何写入到磁盘上的,请结合lucene底层来讲讲

 其中引用起来的就是chatGPT告诉我的答案。chatGPT是一个很厉害的科学家,同时又很擅长说谎话。所以和chatGPT交流学习,最大的困难点,就是识别他说的谎话。

在Elasticsearch中,一条JSON数据是被索引到Lucene底层中的,Lucene底层是Elasticsearch用来存储和检索文档的核心引擎。

当一条JSON数据被索引到Elasticsearch中时,它首先会被转换为一个Lucene文档(Document)。Lucene文档是一个由多个字段组成的数据结构,每个字段都包含一个名称和一个值。在Elasticsearch中,每个JSON对象的属性都被映射为一个Lucene字段,其值则被存储在相应的字段中。

一旦JSON数据被转换为Lucene文档,它就可以被写入到磁盘上的Lucene索引文件中。Lucene索引文件是一个由多个段(Segment)组成的数据结构,每个段包含一部分文档和相关的元数据信息。当文档被写入到索引文件时,它会被分配到一个或多个段中,这些段可以是新建的,也可以是已存在的。

在Elasticsearch中,写入到磁盘上的数据是由分片(Shard)组成的。每个分片都是一个独立的Lucene索引,它可以存储一部分文档数据和元数据信息。当一条JSON数据被写入到Elasticsearch中时,它会被分配到一个或多个分片中,这些分片可以分布在不同的节点上,从而实现数据的分布式存储和检索。

总的来说,在Elasticsearch中,一条JSON数据是被转换为一个Lucene文档,并写入到分片的Lucene索引文件中的。这个过程涉及到很多细节和优化,Elasticsearch会尽可能地利用Lucene底层的特性来提高性能和可扩展性。

 第一个问题,看起来没有什么问题,因为只是笼统的回答一下。但是不是很详细,chatGPT也说了,涉及到了很多的细节和优化。那就接着继续问问。

 Q1.2这个过程涉及到哪些细节和什么优化

将一条JSON数据写入到磁盘上的Lucene索引文件中,涉及到很多细节和优化,其中一些关键点包括:

  1. 映射:将JSON数据映射到Lucene文档中,这包括对每个属性进行分词、索引和存储的处理。Elasticsearch会根据字段的类型和映射设置,自动进行数据转换和处理,以便正确地存储和检索数据。

  2. 索引:将Lucene文档写入到分片的索引文件中。这包括对文档进行分析、建立倒排索引、写入磁盘等一系列操作。Elasticsearch会利用Lucene底层的优化机制,如内存缓存、合并段、索引压缩等,以提高写入性能和减少磁盘空间占用。

  3. 分片:将索引数据分配到多个分片中,以实现数据的分布式存储和检索。Elasticsearch会根据集群配置和数据负载,自动进行分片和副本的分配和调整,以实现数据的高可用性和性能优化。

  4. 事务:将数据写入到索引文件时,需要保证数据的一致性和可靠性。Elasticsearch会利用Lucene底层的事务机制,如基于文件锁的事务管理和崩溃恢复机制,以确保数据写入的原子性和可靠性。

  5. 缓存:为了提高查询性能和减少磁盘I/O,Elasticsearch会利用Lucene底层的缓存机制,如过滤器缓存、字段数据缓存、近实时搜索等,以减少重复计算和磁盘访问。

总的来说,Elasticsearch通过利用Lucene底层的优化机制和特性,以及自身的分布式架构和算法,实现了高性能、可扩展和可靠的数据存储和检索。同时,Elasticsearch还提供了丰富的API和工具,方便用户进行数据操作和管理。

  这里的回答,看起来也都还行。 但还是不是我想要的答案。接下来我想问问他源码。

Q1.3还是不够详细,请结合源码跟我讲讲

Elasticsearch的源码实现涉及到多个模块和组件,其中核心部分是基于Lucene底层实现的。在这里,我会结合源码解析一下Elasticsearch将一条JSON数据写入到磁盘上的过程。

  • 映射:在Elasticsearch中,将JSON数据映射为Lucene文档是通过Mapping和Analyzer两个组件实现的。Mapping定义了字段的数据类型、分析器、存储方式等属性,Analyzer则负责对文本进行分词、过滤、归一化等处理。

在源码中,Mapping的定义是通过IndicesModule组件实现的,而Analyzer则是通过AnalysisModule和Analysis类实现的。当一条JSON数据被索引时,Elasticsearch会根据Mapping和Analyzer的定义,将数据转换为一个Lucene文档。

  • 索引:将Lucene文档写入到分片的索引文件中,是通过IndexWriter和IndexShard类实现的。IndexWriter是Lucene底层的核心组件,它负责对文档进行分析、建立倒排索引、写入磁盘等操作。

在Elasticsearch中,每个分片都有一个对应的IndexShard对象,它封装了Lucene的IndexWriter和IndexReader组件,以及相关的元数据信息。当一条JSON数据被写入到Elasticsearch时,它会被分配到一个或多个分片中,然后通过IndexShard的Index方法将文档写入到索引文件中。

  • 分片:将索引数据分配到多个分片中,是通过ClusterService和ShardRouting类实现的。ClusterService是Elasticsearch的集群管理组件,它负责管理集群的状态和拓扑结构,以及处理分片的分配和调度。

当一条JSON数据被写入到Elasticsearch时,它首先会被发送到一个主节点上进行处理,然后根据集群配置和数据负载,ClusterService会计算出将数据分配到哪些分片中。这个过程涉及到一些复杂的算法和策略,如哈希分片、一致性哈希、负载均衡等。

  • 事务:将数据写入到索引文件时,需要保证数据的一致性和可靠性。在Lucene底层,这个问题是通过两个机制来解决的:事务日志(Transaction Log)和段合并(Segment Merge)。

在Elasticsearch中,Transaction Log是通过Translog类实现的,它负责记录文档的变化操作,以便在崩溃或重启时进行恢复。Segment Merge则是通过IndexWriter和IndexReader组件实现的,它负责将多个小段合并成一个大段,以减少磁盘空间占用和提高查询性能。

  • 刷新和提交:将数据写入到索引文件后,需要将数据刷新到内存缓存和磁盘上。在Elasticsearch中,这个过程是通过IndexWriter和IndexShard类的flush方法实现的。

IndexWriter的flush方法会将内存缓存中的数据写入到磁盘上,并生成一个新的段(Segment),同时将事务日志清空。IndexShard的flush方法会将IndexWriter的缓存和元数据信息同步到内存中,并更新分片的状态信息。

当一批数据被写入到Elasticsearch后,它们并不会立即生效,直到进行了提交(Commit)操作。在Elasticsearch中,提交是通过IndexWriter的commit方法实现的,它会将所有未提交的数据刷新到磁盘上,并更新分片的元数据信息。

  • 性能优化:在将数据写入到Elasticsearch时,有一些性能优化技巧可以提高写入速度和可靠性。其中一些技巧包括:
    1. 批量写入:将多条数据合并成一个批次,一次性写入到Elasticsearch中,可以减少网络开销和提高写入性能。
    2. 索引分片:将索引数据分配到多个分片中,可以提高并发写入能力和水平扩展性。
    3. 内存管理:合理地管理内存缓存和JVM堆内存,可以避免OOM和GC问题,提高写入性能和稳定性。
    4. 硬件优化:选择高性能的硬件设备和存储介质,可以提高磁盘IO速度和可靠性。

总体来说,将一条JSON数据写入到Elasticsearch中,涉及到多个组件和技术细节,包括数据映射、索引写入、分片管理、事务处理、数据刷新和性能优化等方面。理解这些细节和技术原理,可以帮助我们更好地理解和使用Elasticsearch,并在实际应用中提高性能和可靠性。

   回答行云流水,不管对不对,先炸一下它。

Q1.4 你不能骗我,你要根据es官网和lucene官网回答我,最好还能结合源码!

  这次回答要比上边更好一点了。这里chatGPT不仅讲了在es中的操作步骤,而且还讲了一下在lucene中的过程。这一次的答案已经趋向于我想要的答案了。

非常抱歉,我的回答并不够详细和准确。以下是根据Elasticsearch和Lucene官方文档以及源码的详细解释。

在Elasticsearch中,一条JSON数据写入到磁盘的过程可以分为以下几个步骤:

  1. 数据映射:将JSON数据转换成Lucene文档(Document),并根据索引的映射规则(Mapping)将文档字段映射到Lucene字段(Field)中。这个过程是由IndexRequest类和IndexService类实现的。

  2. 索引写入:将文档写入到分片(Shard)的内存缓存中,同时将操作记录到事务日志(Translog)中。这个过程是由IndexShard类和Translog类实现的。

  3. 文档合并:将多个内存缓存中的文档合并成一个文档列表,并对文档列表进行排序和去重。这个过程是由InMemoryMerger类实现的。

  4. 索引合并:将合并后的文档列表写入到磁盘上的索引文件(Index File)中,并更新分片的元数据信息。这个过程是由IndexWriter类和Segment类实现的。

  5. 刷新和提交:将数据写入到索引文件后,需要将数据刷新到内存缓存和磁盘上。在Elasticsearch中,这个过程是通过IndexWriter和IndexShard类的flush方法实现的。当一批数据被写入到Elasticsearch后,它们并不会立即生效,直到进行了提交(Commit)操作。在Elasticsearch中,提交是通过IndexWriter的commit方法实现的,它会将所有未提交的数据刷新到磁盘上,并更新分片的元数据信息。

在Lucene底层实现上,索引写入的过程包括以下步骤:

  1. 文档分析:将文档内容进行分析和处理,生成一组词汇单元(Term)。

  2. 倒排索引写入:将文档的词汇单元写入到倒排索引(Inverted Index)中。倒排索引是一个数据结构,用于记录每个词汇单元出现在哪些文档中,并存储一些额外的统计信息(如出现次数、位置等)。

  3. 磁盘写入:将倒排索引写入到磁盘上的索引文件中。索引文件是一个二进制文件,用于持久化存储倒排索引和其他元数据信息。

  4. 内存管理:对内存缓存中的倒排索引进行管理,包括内存回收、内存合并和内存清理等操作。

  5. 索引合并:将多个磁盘索引文件合并成一个新的索引文件,并进行一些优化操作,如合并多个倒排索引、去重、压缩等。这个过程是由IndexWriter类的merge方法和MergePolicy类实现的。

  6. 索引优化:对索引文件进行优化,如减少文件数量、优化查询性能、减少索引大小等。这个过程是由IndexWriter类的optimize方法和MergePolicy类实现的。

  7. 在Lucene中,还有一些与索引写入相关的细节和优化,如:

    1. 内存缓存管理:Lucene会将一部分倒排索引存储在内存中,以加快索引写入和查询速度。但是,内存缓存的大小是有限制的,一旦缓存满了,就需要将其中的索引数据写入到磁盘上。

    2. 总之,索引写入是Elasticsearch和Lucene的核心功能之一,它涉及到多个组件和细节,包括数据映射、索引写入、索引合并、内存管理、磁盘写入优化等。通过对这些细节和优化进行深入理解,可以帮助我们更好地使用和优化Elasticsearch和Lucene。

    3. 磁盘写入优化:Lucene使用一些技术来优化磁盘写入性能,如缓存写入数据、使用多线程写入等。

    4. 索引压缩:Lucene会对索引文件进行压缩,以减少索引文件的大小,从而提高查询性能。索引压缩是在索引合并和优化过程中完成的。

    5. 数据结构优化:Lucene使用一些高效的数据结构来存储倒排索引和其他元数据信息,如FST、DFA、IntBlockPool等。这些数据结构可以显著提高索引写入和查询的性能。

Q1.5  请再帮我精确地找到源码的位置 es使用7.11.1版本最好

amazing!到这里,我觉得惊呆了,以前看源码的时候,可没有这么轻松。需要看好久才能捋出来这么一个列表。大概根据chatGPT给列出来的源码位置,点开看了看 ,还可以(还没有都点开验证)。 但是其中第四条 chatGPT说 “FielddataIndexFieldData类实现了倒排索引的存储和查询功能” 这个肯定是不对的。这部分肯定是lucene实现的。

  1. 数据映射:数据映射的相关代码位于 org.elasticsearch.index.mapper 包下。

  2. 索引写入:索引写入的相关代码位于 org.elasticsearch.index.engine 包下。其中,IndexWriter类位于 org.elasticsearch.index.engine.Engine 文件中。

  3. 倒排索引:倒排索引的相关代码位于 org.elasticsearch.index.fielddata 包下。其中,FielddataIndexFieldData类实现了倒排索引的存储和查询功能,位于 org.elasticsearch.index.fielddata.IndexFieldData.java 文件中。

  4. 索引合并:索引合并的相关代码位于 org.elasticsearch.index.merge 包下。其中,IndexWriter类的merge方法位于 org.elasticsearch.index.engine.Engine 文件中。

  5. 索引优化:索引优化的相关代码位于 org.elasticsearch.index.engine 包下。其中,IndexWriter类的optimize方法位于 org.elasticsearch.index.engine.Engine 文件中。

其他与索引写入相关的细节和优化的代码位于不同的包和类中,具体位置如下:

  1. 内存缓存管理:内存缓存管理的相关代码位于 org.elasticsearch.index.shard 包下。其中,IndexShard类负责管理内存缓存,位于 org.elasticsearch.index.shard.IndexShard 文件中。

  2. 磁盘写入优化:磁盘写入优化的相关代码位于 org.elasticsearch.index.translog 包下。其中,Translog类实现了磁盘写入的缓存和优化功能,位于 org.elasticsearch.index.translog.Translog.java 文件中。

  3. 索引压缩:索引压缩的相关代码位于 org.elasticsearch.index.codec 包下。其中,Lucene索引压缩的实现位于 org.elasticsearch.index.codec.CodecService 类中,而Elasticsearch自身的索引压缩实现位于 org.elasticsearch.index.codec.PostingsFormat 类中。

  4. 数据结构优化:Lucene使用的高效数据结构的相关代码位于 org.apache.lucene.util 包下,其中FST的实现位于 org.apache.lucene.util.fst 包下,DFA的实现位于 org.apache.lucene.util.automaton 包下,IntBlockPool的实现位于 org.apache.lucene.util.packed 包下。Elasticsearch自身使用的高效数据结构的相关代码位于 org.elasticsearch.common.util 包下。

  5. 索引刷新:索引刷新的相关代码位于 org.elasticsearch.index.engine 包下。其中,IndexWriter类的flush方法位于 org.elasticsearch.index.engine.Engine 文件中。

  6. 索引删除:索引删除的相关代码位于 org.elasticsearch.index.engine 包下。其中,IndexWriter类的delete方法和deleteByQuery方法位于 org.elasticsearch.index.engine.Engine 文件中。

  7. 索引恢复:索引恢复的相关代码位于 org.elasticsearch.index.engine 包下。其中,IndexWriter类的recovery方法位于 org.elasticsearch.index.engine.Engine 文件中。

  8. 索引分片:索引分片的相关代码位于 org.elasticsearch.index.shard 包下。其中,IndexShard类负责管理和操作索引分片,位于 org.elasticsearch.index.shard.IndexShard 文件中。

  9. 数据写入确认:数据写入确认的相关代码位于 org.elasticsearch.index.translog 包下。其中,Translog类实现了数据写入确认的功能,位于 org.elasticsearch.index.translog.Translog.java 文件中。

  10. 索引同步:索引同步的相关代码位于 org.elasticsearch.index.engine 包下。其中,IndexWriter类的sync方法位于 org.elasticsearch.index.engine.Engine 文件中。

  11. 索引缓存:索引缓存的相关代码位于 org.elasticsearch.index.cache 包下。其中,IndexCache类负责管理和操作索引缓存,位于 org.elasticsearch.index.cache.IndexCache.java 文件中。

  12. 索引快照:索引快照的相关代码位于 org.elasticsearch.index.snapshots 包下。其中,IndexShardSnapshot类实现了索引快照的存储和恢复功能,位于 org.elasticsearch.index.snapshots.IndexShardSnapshot.java 文件中。

  13. 索引复制:索引复制的相关代码位于 org.elasticsearch.index.shard 包下。其中,IndexShard类实现了索引复制的功能,位于 org.elasticsearch.index.shard.IndexShard.java 文件中。

  14. 索引压缩:索引压缩的相关代码位于 org.elasticsearch.index.codec 包下。其中,PostingsFormat类和DocValuesFormat类负责控制索引压缩的方式和格式,位于 org.elasticsearch.index.codec 文件夹中。

  15. 索引合并:索引合并的相关代码位于 org.elasticsearch.index.merge 包下。其中,MergePolicy类和MergeScheduler类负责控制索引合并的策略和调度,位于 org.elasticsearch.index.merge 文件夹中。

  16. 索引优化:索引优化的相关代码位于 org.elasticsearch.index.engine 包下。其中,IndexWriter类的forceMerge方法位于 org.elasticsearch.index.engine.Engine 文件中。

  17. 索引自动切分:索引自动切分的相关代码位于 org.elasticsearch.index 包下。其中,IndexService类负责控制索引的自动切分,位于 org.elasticsearch.index.IndexService 文件中。

  18. 索引查询:索引查询的相关代码位于 org.elasticsearch.index.query 包下。其中,Query类和QueryBuilder类负责控制索引查询的方式和格式,位于 org.elasticsearch.index.query 文件夹中。

  19. 索引统计:索引统计的相关代码位于 org.elasticsearch.index.fielddata 包下。其中,FieldDataType类和FieldDataStats类负责控制索引统计的方式和格式,位于 org.elasticsearch.index.fielddata 文件夹中。

  20. 索引分析:索引分析的相关代码位于 org.elasticsearch.index.analysis 包下。其中,Analyzer类和TokenFilter类负责控制索引分析的方式和格式,位于 org.elasticsearch.index.analysis 文件夹中。

  接下来再用一个问题来验证。

Q 1.6  我有个疑问,你确定 FielddataIndexFieldData类实现了倒排索引的存储和查询功能吗

非常抱歉,我在之前的回答中有误,FielddataIndexFieldData 类并没有实现倒排索引的存储和查询功能。

FielddataIndexFieldData 类是 Elasticsearch 中用于在内存中存储分段的字段数据的一个数据结构,通常用于聚合、排序和脚本等功能的计算。它不是存储实际的倒排索引,而是对已经建立好的倒排索引数据进行了提取和封装,方便后续的处理和计算。

实际上,倒排索引是在建立索引时创建的,主要由 Lucene 库实现,而不是 Elasticsearch 本身。Elasticsearch 的索引底层是基于 Lucene 的,它使用了 Lucene 的倒排索引机制来存储和查询数据。Lucene 的倒排索引主要包括 Term、Document 和 Field 等概念,可以通过 IndexReader、IndexWriter、TermQuery、BooleanQuery 等 Lucene 类进行索引的存储和查询操作。

因此,如果您需要深入了解 Elasticsearch 中倒排索引的实现和细节,建议参考 Lucene 相关的文档和资料。

Q1.7 那你检查一下上边说的源码的位置,还有没有错的了

 于是chatGPT又列出和倒排索引相关的源码了。

非常抱歉之前的回答中有误,FielddataIndexFieldData 类并没有实现倒排索引的存储和查询功能。

以下是 Elasticsearch 7.11.1 版本中倒排索引存储和查询的相关源代码位置:

  • 倒排索引存储

在 Elasticsearch 中,倒排索引是在建立索引时创建的,主要由 Lucene 库实现。在 Elasticsearch 的源代码中,建立索引的主要逻辑位于 org.elasticsearch.index.IndexService 类中,具体实现可以参考 org.elasticsearch.index.engine.InternalEngine 类的 IndexWriter 内部类。倒排索引数据存储在磁盘上,位于索引目录下的 segments_N 文件中,其中 N 表示索引分段编号。

  • 倒排索引查询

在 Elasticsearch 中,查询请求通过各种查询语句和过滤器进行构建,这些查询语句和过滤器最终会转换为 Lucene 的 Query 和 Filter 对象,然后通过 org.elasticsearch.index.search.SearchService 类的 search 方法进行查询。在 SearchService 类中,使用 Lucene 的 IndexSearcher 对象对索引进行搜索,具体实现可以参考 org.elasticsearch.index.search.DefaultSearchContext 类和 org.elasticsearch.search.SearchHit 类。

对于搜索结果的排序和分页,Elasticsearch 使用了 Lucene 的 ScoreDoc 和 TopDocs 对象,这些对象包含了查询结果的相关性分数和文档 ID 等信息。在 Elasticsearch 的源代码中,相关性分数的计算和排序逻辑可以参考 org.elasticsearch.search.SearchHits 类的 sortgetAt 方法。分页逻辑可以参考 org.elasticsearch.search.SearchHit 类的 shardid 字段。

在 Elasticsearch 中,查询请求可以分为两种类型:分片查询和全局查询。分片查询是指查询请求只在单个分片上进行查询,并返回查询结果,全局查询是指查询请求在所有分片上进行查询,并返回聚合的查询结果。

对于分片查询,每个分片会使用 Lucene 的 IndexSearcher 对象进行查询,并返回查询结果。在 Elasticsearch 的源代码中,具体实现可以参考 org.elasticsearch.search.query.QueryPhase 类和 org.elasticsearch.search.fetch.subphase.DocIdSearchFetchSubPhase 类。QueryPhase 类是分片查询的主要逻辑实现类,它使用 Lucene 的 QueryParser 和 QueryRewriteChain 等对象对查询语句进行解析和重写,然后使用 Lucene 的 IndexSearcher 对象对分片上的索引进行查询。DocIdSearchFetchSubPhase 类则是对查询结果进行文档 ID 提取和转换的实现类。

对于全局查询,Elasticsearch 会将查询请求发送到所有的分片上,并在所有分片上进行查询。查询结果会通过 org.elasticsearch.action.search.SearchPhaseController 类进行合并和排序,并返回给客户端。具体实现可以参考 org.elasticsearch.action.search.TransportSearchAction 类和 org.elasticsearch.search.fetch.subphase.HighlightPhase 类。TransportSearchAction 类是全局查询的主要逻辑实现类,它负责将查询请求发送到所有分片上,并通过 SearchPhaseController 类进行查询结果的合并和排序。HighlightPhase 类则是对查询结果进行高亮处理的实现类。

总之,倒排索引是 Elasticsearch 和 Lucene 中非常重要的数据结构,它可以大大提高搜索性能和查询效率。在 Elasticsearch 中,倒排索引的存储和查询主要依赖于 Lucene 库的实现,同时也涉及到大量的优化和改进,以满足不同的查询需求和性能要求。

最后chatGPT说,让我去看看源码。并可以参与开发和贡献代码。 不得不说,还是chatGPT懂我。

如果您想了解更多关于 Elasticsearch 的源码位置和细节,请参考以下官方文档和 GitHub 仓库:

  1. Elasticsearch 官方文档:Elasticsearch Guide [8.7] | Elastic

  2. Elasticsearch GitHub 仓库:GitHub - elastic/elasticsearch: Free and Open, Distributed, RESTful Search Engine

在官方文档中,您可以找到详细的 Elasticsearch 使用文档和参考手册,以及各个版本的发行说明和更新日志。

在 GitHub 仓库中,您可以找到 Elasticsearch 的完整源代码,并可以参与开发和贡献代码。

相关文章:

让chatGPT当我的老师如何? 通过和chatGPT交互式学习,了解在ES中,一条JSON数据是如何写到磁盘上的

最近一直有一个问题,如鲠在喉。争取早一天解决,早一天踏踏实实的睡觉。 问题是:在ES中,一条JSON数据是如何写入到磁盘上的? 如何解决这个问题?我想到了chatGPT,还有lucene的学习资料。这篇文章&…...

chapter-7数据库事务

以下课程来源于MOOC学习—原课程请见:数据库原理与应用 考研复习 DBMS保证系统中一切事务的原子性、一致性、隔离性和持续性 DBMS必须对事务故障、系统故障和介质故障进行恢复 恢复中最经常使用的技术:数据库转储和登记日志文件 恢复的基本原理&#…...

阿里本地生活再出发:口碑入高德,备战美团、抖音

配图来自Canva可画 近日,有传言称高德地图将和阿里本地生活旗下的到店业务口碑正式合并,未来阿里旗下所有的本地生活到店业务都将统一整合在高德地图的入口中。3月22日,高德地图正式确认了此事,并表示高德地图作为“出门好生活开…...

SSM学习记录3:响应(注释方式 + SprigMVC项目 + 2022发布版本IDEA)

响应 ResponseBody注解的作用是将当前控制器中方法的返回值作为响应体 1.返回页面 无需在方法上进行ResponseBody注解,只需RequestMapping匹配地址,并且返回值为带后缀的页面名字符串 前面学习中除了json数据,所有带ResponseBody注解的方法…...

Linux·gcc 编译优化简介

1、gcc 编译优化简介 gcc 提供了为了满足用户不同程度的的优化需要,提供了近百种优化选项,用来对 { 编译时间,目标文件长度,执行效率 } 这个三维模型进行不同的取舍和平衡。优化的方法不一而足,总体上将有以下几类&…...

【电子学会】2022年12月图形化一级 -- 潜水

潜水 暑假小雨和爸爸去玩了潜水,他见到了各种各样的海洋生物。 1. 准备工作 (1)添加背景“Underwater 2”; (2)删除小猫角色,添加角色“Diver2”、“Fish”、“Jellyfish”、“Shark”; (3)为背景添加声音“Xylo2”。 2. 功能实现 (1)点击绿旗,播放背景音乐…...

MySQL日期时间函数汇总、时间格式转换方法

MySQL日期时间函数汇总、时间格式转换方法时间函数日期时间格式转换date_format函数EXTRACT()DATE_ADD()DATE_SUB()DATEDIFF函数时间函数 函数描述NOW()返回当前的日期和时间CURDATE()返回当前的日期CURTIME()返回当前的时间DATE()返回日期或日期/时间表达式的日期部分HOUR()获…...

【CSS】使用绝对定位 / 浮动解决外边距塌陷问题 ( 为父容器 / 子元素设置内边距 / 边框 | 为子元素设置浮动 | 为子元素设置绝对定位 )

文章目录一、外边距塌陷描述1、没有塌陷的情况2、外边距塌陷情况二、传统方法解决外边距塌陷 - 为父容器 / 子元素设置内边距 / 边框三、使用浮动解决外边距塌陷 - 为子元素设置浮动四、使用绝对定位解决外边距塌陷 - 为子元素设置绝对定位一、外边距塌陷描述 在 标准流的父盒子…...

前端手写综合考题

1 实现一个 // 使用 promise来实现 sleepconst sleep (time) > {return new Promise(resolve > setTimeout(resolve, time))}sleep(1000).then(() > {// 这里写你的骚操作}) sleep 函数,比如 sleep(1000) 意味着等待1000毫秒 2 给定两个数组&#xff0c…...

数据结构-排序

本节目标: 1.排序的概念及其运用 2.常见排序算法的实现 3.排序算法复杂度及稳定性分析 1.排序的概念及其应用 1.1排序的概念 排序就是按照某个我们设定的关键字,或者关键词,递增或者递减,完成这样的操作就是排序。 1.2排…...

ROS话题通信自定义+发布订阅代码--03

话题通信自定义msg 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味…...

【MySQL】实验七 视图

文章目录 1. 建立city值为上海、北京的顾客视图2. 建立城市为上海的客户2016年的订单信息视图3. SQL视图:建立视图AVG_CJ4. SQL视图:建立视图IS_STUDENT5. SQL视图:建立视图CJ_STUDENT6. SQL视图:根据视图CJ_STUDENT创建视图CJ_TJ1. 建立city值为上海、北京的顾客视图 建立…...

Linux常见操作命令【三】

一、系统资源 1.1 ps(process staus) ps -ef e显示所有进程、f全格式 ps -aux 显示所有包含其他使用者的进程 ps -ef | grep CCC 查找含有CCC进程的格式 ps -u username 显示指定进程用户信息1.2 kill kill 12345 杀死进程12345 kill -KILL…...

C-关键字(下)

文章目录循环控制switch-case-break-defaultdo-while-forgetchar()break-continuegotovoidvoid*returnconstconst修饰变量const修饰数组const修饰指针指针补充const 修饰返回值volatilestruct柔型数组union联合体联合体空间开辟问题利用联合体的性质,判断机器是大端还是小端enu…...

关于电商商品数据API接口列表,你想知道的(详情页、Sku信息、商品描述、评论问答列表)

目录 一、商品数据API接口列表 二、商品详情数据API调用代码item_get 三、获取sku详细信息item_sku 四、获得淘宝商品评论item_review 五、数据说明文档 进入 一、商品数据API接口列表 二、商品详情数据API调用代码item_get <?php// 请求示例 url 默认请求参数已经URL…...

232:vue+openlayers选择左右两部分的地图,不重复,横向卷帘

第232个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers项目中自定义js实现横向卷帘。这个示例中从左右两个选择框中来选择不同的地图,做了不重复的处理,即同一个数组,两部分根据选择后的状态做disabled处理,避免重复选择。 直接复制下面的 vue+openlayers…...

溯源取证-内存取证 高难度篇

今天的场景依然是windows场景&#xff0c;只不过此次场景分为两个镜像&#xff0c;本次学习主要学习如何晒别钓鱼邮件、如何提取钓鱼邮件、如何修复损坏的恶意文件、如何提取DLL动态链接库文件 本次需要使用的工具&#xff1a; volatility_2.6_lin64_standalone readpst clams…...

JAVA语言中的代理模式

代理可以进一步划分为静态代理和动态代理&#xff0c;代理模式在实际的生活中场景很多&#xff0c;例如中介、律师、代购等行业&#xff0c;都是简单的代理逻辑&#xff0c;在这个模式下存在两个关键角色&#xff1a; 目标对象角色&#xff1a;即代理对象所代表的对象。 代理…...

最后一步:渲染和绘制

浏览器的工作步骤如下&#xff1a; URL>字符流>词&#xff08;token&#xff09;流>DOM树&#xff08;不含样式信息的 DOM&#xff09;>DOM树CSS规则&#xff08;含样式信息的 DOM&#xff09;>根据样式信息&#xff0c;计算了每个元素的位置和大小>根据这些…...

C++类和对象终章——友元函数 | 友元类 | 内部类 | 匿名对象 | 关于拷贝对象时一些编译器优化

文章目录&#x1f490;专栏导读&#x1f490;文章导读&#x1f337;友元&#x1f33a;概念&#x1f33a;友元函数&#x1f341;友元函数的重要性质&#x1f33a;友元类&#x1f341;友元类的重要性质&#x1f337;内部类&#xff08;不常用&#xff09;&#x1f33a;内部类的性…...

拼多多按关键字搜索商品 API

一、拼多多平台优势&#xff1a; 1、独创拼团模式 拼团拼单是拼多多独创的营销模式&#xff0c;其特点是基于人脉社交的裂变传播&#xff0c;非常具有传播性。 由于本身走低价路线&#xff0c;加上拼单折扣&#xff0c;商品的分享和人群裂变效果非常明显&#xff0c;电商前期…...

全链路日志追踪

背景 最近线上的日志全局追踪 traceId 不好使了&#xff0c;不同请求经常出现重复的 traceId&#xff0c;或者通过某个请求的 traceId 追踪搜索&#xff0c;检索出了与该请求完全不相干的日志。我领导叫我去排查解决这个问题&#xff0c;这里我把我排查的过程思路以及如何解决…...

ZYNQ:【1】深入理解PS端的TTC定时器(Part1:原理+官方案例讲解)

碎碎念&#xff1a;好久不见&#xff0c;甚是想念&#xff01;本期带来的是有关ZYNQ7020的内容&#xff0c;我们知道ZYNQ作为一款具有硬核的SOC&#xff0c;PS端很强大&#xff0c;可以更加便捷地实现一些算法验证。本文具体讲解一下里面的TTC定时器&#xff0c;之后发布的Part…...

蓝牙设备如何自定义UUID

如何自定义UUID 所有 BLE 自定义服务和特性必须使用 128 位 UUID 来识别&#xff0c;并且要确保基本 UUID 与 BLE 定义的基本 UUID&#xff08;00000000-0000-1000-8000-00805F9B34FB&#xff09;不一样。基本 UUID 是一个 128 位的数值&#xff0c;根据该值可定义标准UUID&am…...

好看的html登录界面,

界面效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><title>Login Page</title><style>body {background-color: #f2f2f2;font-family: Arial, sans-serif;}form {background-color: #fff;border-radius: 5px;box-shado…...

Java模拟星空

目录 前言 JavaFX基础 1. GraphicsContext 2. AnimationTimer 代码实现 完整代码 前言 看了Python模拟星空很漂亮&#xff0c;Java也应该必须有一个&#xff01; 环境&#xff1a;只需要JDK1.8就好&#xff01;不需要外部包&#xff01;&#xff01;&#xff01; Jav…...

YGG 代表 Web3 Gaming 参加 2023 年游戏开发者大会

Yield Guild Games&#xff08;YGG&#xff09;在 2023 年 3 月 20 日至 24 日在加州旧金山举行的游戏开发者大会&#xff08;GDC&#xff09;上大显身手&#xff0c;这是游戏开发者的重要交流学习活动。虽然 GDC 本身提供了多种多样的活动&#xff0c;包括讲座、小组讨论、圆桌…...

水库安全运行智慧管理平台解决方案筑牢防汛“安全墙”

解决方案 水库安全运行智慧管理系统解决方案&#xff0c;系统主要由降雨量监测站、水库水位监测站、大坝安全监测中的渗流量、渗流压力和变形监测站及视频和图像监测站等站点组成&#xff0c;同时建立规范、统一的监测平台&#xff0c;集数据传输、信息共享、数据储存于一体&a…...

Exchange升级部署方案

目录 前言 一、需求分析 二、升级前准备 1.备份当前 Exchange Server 数据...

AE开发之图层渲染20210603

AE开发之图层渲染比例符号化地图的整饰唯一值符号的符号化过程点符号设置&#xff0c;线符号设置标注图层&#xff0c;&#xff08;写得不好&#xff0c;不推荐看) 唯一值符号化&#xff0c;字段进行设置&#xff0c;这里用到了UniqueValueRenderer接口&#xff0c;这里面有一…...