范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

ElasticSearch原理及应用

  ElasticSearch是一个分布式、基于RESTful风格的数据搜索和分析引擎。ElasticSearch的底层全文检索基于Lucene实现,其灵活的数据存取和分析方式、良好的性能和稳定性使其在大数据存储和分析领域被广泛使用。
  ElasticSearch的概念和原理
  Lucene
  ElasticSearch的底层存储基于Lucene实现,Lucene是Apache软件基金的一个开源子项目,是一套全文检索引擎架构,提供了完整的文本分析引擎、数据查询引擎和数据索引引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以便在目标系统中实现全文检索的功能,或者以Lucene为基础建立一套完整的全文检索引擎。
  倒排索引-Inverted Index
  倒排索引表中的每一项都包括一个属性值和具有该属性值对应记录的地址。由于不是按照记录来确定属性值的,而是由属性值来确定记录的位置的,因此被称为倒排索引。
  带有倒排索引的文件被称为倒排索引文件(Inverted File)。倒排索引的索引对象是文档或者文档集合中的单词,倒排索引文件被用来存储这些单词在一个文档或者一组文档中的位置。
  Lucene的架构
  Lucene是一个高并发、高吞吐、可扩展的全文检索库。它基于Java实现,使用方便。Lucene内部的数据结构叫作文档(Document),当应用层的数据(例如,FileSystem、Web Data、DataBase等)进入Lucene时,首先会进行索引文档(Index Document)操作,按照索引规则创建倒排索引;在应用程序查询数据的时候,直接查询提前建好的倒排索引,因此其效率十分高。
  Lucene的全文检索流程
  创建索引:获取文档、构建文档对象、文档分词和创建索引;
  查询索引:调用查询接口、创建查询、执行查询和结果返回。
  创建索引流程:
  (1)获取文档:获取文档的过程即数据采集的过程。Lucene中的文档指要索引和搜索的原始内容。文档内容可以是互联网上的网页、数据库中的数据、磁盘上的日志文件等。
  (2)构建文档对象:当获取文档内容后,需要根据文档内容构建文档(Document)对象,每个文档对象都包含一个唯一的文档id和多个Field,每个Field中都存储着不同的文档内容。例如,将磁盘上一个包含一篇文章的TXT文件当成一个Document,则Document中包含多个Field。每个Field都包含不同的内容,比如file_name(文件名称)、file_path(文件路径)、file_size(文件大小)、file_content(文件内容)。
  (3)分析文档:分析文档的过程是将原始内容创建为包含Field的文档(Document)并对Field的内容进行分析的过程。分析文档的过程需要对原始文档执行提取单词、大小写转换、去除标点符号、去除停用词等操作,然后生成最终的语汇单元。语汇单元中的每个单词都被叫作一个Term,不同的Field拆分出来的相同单词是不同的Term。Term中包含两部分:一部分是文档的Field名称,另一部分是单词的内容。
  4)创建索引:创建索引指对所有文档分析得出的Term都进行索引并记录该Term在每个Document中出现的次数的过程。
  查询索引流程:
  查询索引即根据用户输入的关键字,从索引(Index)中进行搜索的过程。查询索引的具体过程为:根据关键字搜索索引,根据索引找到对应的文档,从而找到要搜索的内容。
  (1)用户查询接口:全文检索系统提供的用户搜索界面,实现用户搜索关键字或关键词的提交,以及搜索完成后搜索结果的展示。
  (2)创建查询对象:用户在输入关键字执行搜索之前,需要先构建一个查询对象。查询对象中可以指定要搜索的文档Field、关键字等。
  (3)执行查询:根据查询语法在倒排索引词典表中分别找出对应搜索词的索引,从而找到索引对应的文档链表。搜索过程为在索引中查找Field为fileName且关键字为Lucene的Term,然后根据Term找到对应的文档id列表。
  (4)返回查询结果:将查询的文档id列表返回到用户查询接口。
  ElasticSearch的特点
  (1)高容量:ElasticSearch集群支持PB级数据的存储和查询。
  (2)高吞吐:ElasticSearch支持对海量数据近实时的数据处理。
  (3)高可用:ElasticSearch基于副本机制支持部分服务宕机后仍可正常运行和使用。
  (4)支持多维度数据分析和处理:除了支持全文检索,ElasticSearch还支持基于单字段精确查询和多字段联合查询等复杂的数据查询操作。
  (5)API简单易用:ElasticSearch API简单易用,除了支持REST API,还支持Java、Python等多种客户端形式,且查询方式简单灵活。
  (6)支持插件机制:ElasticSearch支持插件式开发,基于ElasticSearch可以开发自己的分词插件、同步插件、Hadoop插件、可视化插件等。
  ElasticSearch的应用场景
  (1)全文检索
  (2)分布式数据库
  (3)日志分析:通过Logstash等日志采集组件,ElasticSearch可实现复杂的日志数据存储分析和查询,最常用的组合是ELK(ElasticSearch+Logstash+Kibana)技术组合。
  (4)运维监控:运维平台可以基于ElasticSearch实现大规模服务的监控和管理。(5)BI系统:ElasticSearch广泛应用于BI(Business Intelligence,商业智能)系统,例如按照区域统计用户的操作习惯等。
  ElasticSearch的数据模型
  ElasticSearch的数据模型由Index(索引)、Type(类型)和Document(文档)组成。索引是一组具有共同特征的文档集合。每个索引都包含多个类型,每个类型都包含多个文档,每个文档都包含多个Field。
  ElasticSearch分布式架构
  ElasticSearch基于分布式的架构能够支撑PB级数据的搜索和分析。ElasticSearch分布式架构的核心内容包括集群节点角色、集群选举原理、集群状态、数据路由规则、数据分片和副本策略等。
  集群节点角色
  ElasticSearch集群节点角色包括:
  MasterNode(主节点):主要负责集群节点状态的维护、索引的创建删除、数据的Rebalance、分片的分配等工作。MasterNode不负责具体数据的索引和检索,因此其负载较低,服务比较稳定。当MasterNode宕机时,ElasticSearch集群会自动从其他MasterNode中选举出一个Leader继续为集群提供服务。为了防止在选举过程中出现脑裂现象,常常需要设置discovery.zen.minimum_master_nodes=N/2+1,其中N为集群中MasterNode的个数。建议集群中MasterNode的个数为奇数,如3个或者5个。一个节点只包含MasterNode角色的配置如下。
  在一般生产环境中,为了保障MasterNode的稳定运行,不建议在MasterNode上配置数据节点。
  DataNode(数据节点):DataNode是集群的数据节点,主要负责集群中数据的索引创建和检索,具体操作包括数据的索引、搜索、聚合等。DataNode属于I/O、内存和CPU密集型操作,需要的计算资源较大,如果资源允许,则建议使用SSD以加快数据读写的效率。
  设置一个节点为DataNode的配置如下。
  IngestNode(提取节点):IngestNode是执行数据预处理的管道,它在索引之前预处理文档。通过拦截文档的Bulk和Index请求,然后加以转换,最终将文档传回Bulk和Index API,用户可以定义一个管道,指定一系列预处理器。如果集群有复杂的数据预处理逻辑,则该节点属于高负载节点,建议使用专用服务器。
  CoordinatingNode(协调节点):CoordinatingNode用于接收客户端请求,并将请求转发到各个DataNode上。各个DataNode在收到请求后,在本地执行请求操作,并将请求结果反馈给CoordinatingNode,CoordinatingNode在收到所有DataNode的反馈后,进行结果合并,然后将结果返回客户端。
  TribeNode(部落节点):允许TribeNode在多个集群之间充当联合客户端,用于实现跨集群访问。在5.4.0版本以后,TribeNode已经被废弃,并不建议使用,其替代方案为cross-cluster Search。
  数据路由规则
  ElasticSearch的数据路由(Routing)规则用于确定文档存储在哪个索引(Index)的哪个分片(Shard)上。根据路由规则,ElasticSearch将不同文档索引到不同索引的不同分片上。在查询文档的时候,ElasticSearch根据路由规则找到该索引及其对应的分片并查询该文档。
  上述公式简述为文档所在分片等于routing的Hash值除以主分片数量(number_of_primary_shards)的余数。这也是为什么ElasticSearch索引的主分片数量在确定后就不能再修改的原因,因为如果主分片数量发生变化,则之前路由的所有分片都会失效。在使用时,所有API(get、index、delete、bulk、update以及mget)都接收一个叫作routing的路由参数,通过这个参数应用程序可以自定义文档到分片的映射。一个自定义的路由参数可以用来确保所有相关的文档(例如所有属于同一个用户的文档)都被存储到同一个分片中。
  文档分片和副本策略
  ElasticSearch文档分片的原则如下。
  (1)ElasticSearch中的每个索引都由一个或多个分片组成,文档根据路由规则分配到不同分片上。
  (2)每个分片都对应一个Lucene实例,一个分片只能存放Integer.MAX_VALUE-128=2147483519个文档。
  (3)分片主要用于数据的横向分布,ElasticSearch中的分片会被尽可能平均地分配到不同节点上,当有新的节点加入时,ElasticSearch会自动感知并对数据进行relocation操作(例如,有2个节点,4个主分片,那么每个节点都将会分到2个分片,当再增加2个节点后,ElasticSearch会自动执行relocation操作,这时每个节点都将会分到1个分片),relocation保障了集群内数据的均衡分布。
  ElasticSearch文档副本的策略如下。
  (1)ElasticSearch的副本即主分片(Primary Shard)对应数据的副本分片(Replica Shard)。
  (2)为了防止单节点服务器故障,ElasticSearch会将主分片和副本分片分配在不同节点上。ElasticSearch的默认配置是一个索引包含5个分片,每个分片都有1个副本(即5 Primary+5 Replica=10个分片)。
  ElasticSearch的写操作流程
  ElasticSearch的写操作
  ElasticSearch的写操作主要包括索引的创建和删除,以及文档的创建、删除、更新等操作。ElasticSearch首先会在主分片上执行写操作,当主分片上执行成功时,根据集群的数据一致性要求,将在其他副本分片上执行写操作,只有达到一致性要求的节点都执行成功后才向客户端发送成功响应。
  (1)客户端向Node-1发送新建、查询或者删除文档的请求。节点根据文档的_id为1确定文档属于分片1。
  (2)因为分片1的主分片P-1被分配在Node-3上,所以请求会被转发到Node-3。
  (3)在Node-3的主分片上执行请求,如果执行成功,则将请求同时转发到Node-1和Node-2的副本分片R-1上执行。
  (4)当所有副本分片都报告执行成功时,Node-3才向协调节点报告执行成功。
  (5)协调节点向客户端报告成功。当客户端收到成功响应时,文档更新已经在主分片和所有副本分片上都执行成功。
  ElasticSearch的读操作流程
  ElasticSearch在处理读取请求时,协调节点在每次收到客户端请求的时候都会通过轮询所有副本分片来达到负载均衡。当检索时,被索引的文档可能已经在主分片上,但是还没有同步到副本分片。在这种情况下,副本分片可能会报告文档不存在,但是主分片可能会成功返回文档。一旦索引请求成功返回用户,文档在主分片和副本分片上都是可用的。
  (1)客户端向Node-1发送文档读取请求。
  (2)协调节点Node-1根据文档的_id来确定文档属于分片1。分片1的文档数据存在所有3个节点上。在这种情况下,它将请求转发到Node-2。
  (3)Node-2在本地执行查询操作并将查询结果返回到Node-1。
  (4)Node-1(此时Node-1为CoordinatingNode角色)接收Node-2的查询结果,如果查询到请求对应的文档,则将该文档返回客户端。如果在Node-2上未查询到对应的文档数据,则Node-1会继续向其他节点发送文档读取请求,直到查询到文档对应的数据后才返回。如果要读取的文档在所有节点上都不存在,则向客户端报告文档不存在。
  ElasticSearch的应用
  ElasticSearch广泛应用于大数据存储、日志分析、运维监控等多种场景,支持单机部署和集群部署两种方式。在API使用层面,ElasticSearch支持Java API和REST API两种方式。下面将对集群部署和API使用进行介绍。
  ElasticSearch的安装
  (1)安装Java环境,ElasticSearch建议JDK版本大于1.8。
  (2)各服务器之间互信配置。
  (3)到官网下载安装包,ElasticSearch官网的下载。
  (4)执行以下命令修改集群配置文件elasticsearch.yml。
  需要修改的核心配置如下
  (5)执行以下命令启动ElasticSearch。
  (6)在命令行输入curl http://localhost:9200查看ElasticSearch集群的状态,返回结果如下。
  通过上述接口的查询结果可以看到,ElasticSearch集群名称为elasticsearch,集群id为383fPBn4R12SR_4msaqaeQ,集群版本为7.4.2,对应的Lucene版本为8.2.0。
  ElasticSearch的配置和性能调优
  JVM性能调优
  ElasticSearch基于Java实现,默认使用的堆内存为1GB,对于生产环境需要根据系统资源对堆内存进行合理的设置以达到良好的性能表现。执行以下命令对JVM堆内存进行设置。
  如果操作系统有32GB内存,则建议将JVM堆内存的最小值和最大值都设置为16GB。
  这里将堆内存最小值(Xms)与最大值(Xmx)设置相同,防止在ElasticSearch运行过程中JVM改变堆内存大小,引起JVM内存震荡。
  需要注意的是,ElasticSearch除了使用JVM堆内存,其内部Lucene还需要使用大量非堆内存。ElasticSearch内部使用Lucene实现全文检索。Lucene的段分别存储在单个文件中,因为段是不可变的,对缓存友好的,所以在使用段数据时操作系统会把这些段文件缓存起来,以便更快地访问。同时,Lucene可以利用操作系统底层机制来缓存内存数据,加速查询效率。
  Lucene的性能取决于与操作系统交互的速度,而这些交互都需要大量的内存资源(非JVM堆内存),如果把全部内存都分配给JVM堆内存,则将导致Lucene在运行过程中因资源不足而性能下降。一般建议将系统的一半内存分配给JVM堆内存,另外一半内存预留给Lucene和操作系统。比如有32GB内存,可以把16GB分配给JVM堆内存,剩余的16GB预留给Lucene和操作系统。
  操作系统的性能调优
  (1)设置文件句柄:Linux中的每个进程默认打开的最大文件句柄数都是1024,对于服务器进程来说该值太小,可以通过修改/etc/security/limits.conf来增大打开的最大文件句柄数,一般建议设置为65535。
  (2)设置虚拟内存:max_map_count定义了进程能拥有的最多内存区域,一般建议设置为102400。
  (3)关闭Swap:Swap空间是一块磁盘空间,操作系统使用这块空间保存从内存中交互换出的操作系统不常用的Page数据,这样可以分配出更多的内存做Page Cache。通过Swap可以提升系统的吞吐量和I/O性能,但ElasticSearch需要一个所有内存操作都能够被快速执行的环境,服务一旦使用到了Swap内存,就会大大降低数据的存取效率,严重影响性能。
  (4)开启mlockall:打开配置文件中的mlockall开关。它的作用是允许JVM锁住内存,禁止操作系统将内存交换出去。elasticsearch.yml文件中的设置如下
  ElasticSearch API的使用
  ElasticSearch支持Java API和REST API两种方式,下面以Java API为基础介绍ElasticSearch API的基本用法。
  基于Spring Boot建立ElasticSearch项目的步骤如下。
  (1)添加pom.xml依赖:新建Spring Boot项目,并在pom.xml中添加如下ElasticSearch依赖。
  (2)application.yml配置:在项目中添加application.yml配置文件,并在文件中配置ElasticSearch的服务地址和端口
  (3)创建索引:定义BaseElasticService类,并在类中定义创建索引的方法createIndex。具体代码如下
  上述代码中依赖的是RestHighLevelClient实例,Spring Boot会根据配置文件进行自动装配,应用程序只要在需要的时候依赖注入即可。上述代码定义了索引的创建方法createIndex,具体步骤为:定义CreateIndexRequest对象,设置索引的分片数量和副本数量,调用restHighLevelClient.indices().create()创建索引。
  (4)查询索引:在BaseElasticService类中按照如下代码定义查询索引的方法getIndex。
  (5)删除索引:在BaseElasticService类中按照如下代码定义删除索引的方法deleteIndex。
  (6)使用索引API:创建测试类ElasticsearchTest,并在类中添加测试用例IndexAPITest,测试上述(3)~(5)的代码定义的createIndex、getIndex和deleteIndex方法。
  上述代码在测试类ElasticsearchTest中依赖注入BaseElasticService,并调用createIndex、getIndex和deleteIndex方法实现索引的创建、查询和删除。
  (7)新增文档:在BaseElasticService中添加如下新增文档的方法。
  上述代码定义了向ElasticSearch中添加文档的方法add,具体步骤为:定义IndexRequest对象,设置文档id,设置文档数据,执行创建索引操作,返回创建结果。
  (8)批量新增文档:在BaseElasticService中添加批量新增文档的方法。
  上述代码定义了批量新增文档方法batchAdd,具体步骤为:定义BulkRequest对象;遍历List,将文档id和文档内容封装到BulkRequest;批量提交插入操作;返回插入结果。
  (9)查询文档:在BaseElasticService中添加如下查询文档的方法。
  上述代码定义了文档查询方法search,具体步骤为:定义SearchRequest对象,设置SearchSourceBuilder,执行查询,获取查询结果,将查询结果的数据存入List,返回查询结果。
  (10)删除文档:在BaseElasticService中添加如下删除文档的方法。
  上述代码定义了deleteBatch方法用于根据文档id批量删除文档,具体步骤为:定义BulkRequest对象;遍历List,将Index和待删除文档id封装到BulkRequest;执行批量删除操作。
  (11)执行文档的新增操作测试:在DocumentAPITest中添加文档的新增测试用例,并按照如下代码测试文档的新增操作。
  上述代码定义了添加文档测试用例AddAPITest,添加文档分为单个文档添加和批量文档添加。需要注意的是,上述代码将Map的数据结构转换为JSON字符串后作为文档内容添加到ElasticSearch。
  (12)执行文档的查询操作测试:在DocumentAPITest中添加文档的查询测试用例,并按照如下代码测试文档的查询操作。
  (13)执行文档的删除操作测试:当文档不再被需要时,应用程序可以执行如下代码根据文档id删除文档。

不管腌什么酸菜,记住这3点,酸菜不烂不发霉,而且又酸又脆又香气温下降,全国各地的人们都开始忙着做酸菜了。冬天经常大鱼大肉,很容易吃不下饭。又酸又脆的酸菜,既爽口又开胃,还能解腻。天气冷了,买上十几斤大白菜,腌好以后,再也不用担心家里没菜。不天冷多吃扇贝肉,高蛋白低脂肪,好吃不贵,5元炖一锅,太香了导语胜过牛羊肉,高蛋白低脂肪,全身是宝,好吃不贵,5元炖一锅,太香了!别不懂吃人间烟火气,最抚凡人心,人生真正的幸福,不过是灯火阑珊的温暖,和柴米油盐的充实,一日三餐四季,承载着烟新车特斯拉Semi将于12月1日交付约人民币127万元,续航804公里文懂车帝原创周桐懂车帝原创产品日前,特斯拉宣布旗下纯电动重卡Semi将会在12月1日正式开启交付,首批交付客户为百事可乐公司。特斯拉Semi在2017年发布时就收获了不少订单,百事DIY从入门到放弃内存比SSD贵我是服气的稿源中关村在线虽然内存和SSD都是存储产品,但两者的待遇却完全不一样8G内存可以轻松卖到200元的价格,而200元可以买到256GB的SSD,价格差达到了30倍,为什么内存有勇气卖伯恩本赛季英超没几个左后卫比我好,失望没入选英格兰大名单直播吧11月13日讯据TheAthletic网报道,纽卡斯尔联队的英格兰后卫丹伯恩表示,对没有入选英格兰队的世界杯大名单,他感到失望。纽卡斯尔在世界杯休赛期到来前英超排名第三,本赛天舟五号发射升空!飞船返回时会剧烈燃烧,发射时为什么不会?在2022年11月9日天舟四号货运飞船从中国空间站组合体撤离了,在这一天,我们还有一个大动作,那就是天舟五号货运飞船和长征七号遥六运载火箭组合体垂直转运到了发射区。而这些操作也意味天舟五号问天记海报设计潘红宇新华社海南文昌11月12日电题天舟五号问天记新华社记者南海之滨,清波荡漾,椰林婆娑。11月12日10时03分,震天动地的轰鸣之后,长征七号遥六运载火箭托举天舟五号货运全锦赛男单决赛对阵林高远今晚战樊振东,冲三金,四块奖牌到手11月12日,乒乓球全锦赛结束两场男单半决赛较量。在樊振东淘汰牛冠凯之后,林高远击败了刘丁硕,两大世界冠军会师男单决赛。继男团决赛之后,樊振东再度交手林高远,谁胜谁负充满悬念!和国女子在大树上刨皮剁碎拌肉做丸子,煮熟后狂称好吃宴席稀罕菜作者南海看云这道美味的菜,你敢吃不?国家之大造就了各地不同风俗,有不同风俗,就有不同的选择,有些菜的做法可能你吃之后,感觉非常美味,但是如果你知道真相,有些人可能觉得怎么现在还在吃猪肉上面都有盖章,红章蓝章有啥区别呢?看完别乱买了猪肉当中含有很多营养物质,能够满足人体的部分营养需求,瘦猪肉当中含有8种B族维生素,其中维生素B1的含量最高。维生素B1是心脏,大脑,肌肉力量的必需元素。不同部位的猪肉含有的营养价新一代销量神机?红米11A遭到曝光,外观设计基本清晰了不知道大家发现了没有,价格越高配置越强大的手机产品,在销量方面的增长速度反倒是不会特别快,除非是影响力特别强大的机型。然而一些主打性价比或者是低价的机型,往往可以冲击到各种销量榜单
林高远办不到的事王楚钦办到了应该给张本点赞!没他乒坛会更寂寞今晚的WTT新乡世界杯男单决赛,王楚钦42战胜张本智和夺冠,对两名球员我们都应该极力点赞。王楚钦不用说了,我们自己的队员,林高远办不到的事情他办到了,在河南的纽约,赢了国乒男线最大山东泰山31上海海港知错能改善莫大焉今晚山东泰山队在自己的主场以31战胜了投资巨大的上海港。本场比赛凭借克雷桑的梅开二度和伤愈复出的吴兴涵进球轻松地战胜了上海海港。在本场比赛之前领头羊武汉三镇01输给了同样是升班马的理性分析三镇泰山争冠格局摘要三镇缺乏争冠经验护犊子球迷扯后腿泰山屏障球员缺阵卫冕基因历史为零三镇和泰山的联赛争冠变得越来越扑朔迷离,本来一骑绝尘的三镇突然放缓了脚步,个中原因小道消息满天飞。有人说足协不让山东诸城发现龟类足迹新属种新华社济南10月28日电(记者陈国峰)山东省诸城市恐龙文化研究中心研究人员近日在诸城市皇龙沟恐龙足迹化石点进行科学研究时,在恐龙足迹群的中上部发现20多个龟类足迹,其中一个保存完整河北60岁大爷自学酿酒,酿出的酒水5元一斤没人要,到底是咋回事河北60岁大爷自学酿酒,酿出的酒水5元一斤没人要,到底是咋回事其实在白酒刚开始出世的时候,几乎家家户户都会酿制,在唐宋时期开始有专门卖酒水的商铺,并且是门庭若市。现在的话,都是大厂山东好景丨济南莱芜区青山绿水间的好滋味仲秋时节在济南莱芜区的青山绿水间行走,从万福山再到龙崮河,后随一群采摘的人进入利和庄园。这里有科普教育示范区农耕文化体验区,一排排大棚里尽是水果蔬菜。(大众日报客户端记者杨润勤报道外媒NASA捕捉到太阳的微笑,却预示地磁暴有可能袭击地球来源环球网环球网报道见习记者李诗睿微笑的太阳有可能给地球制造问题,美国全国公共广播电台(NPR)英国卫报美国趣味科学网站等媒体29日消息,当地时间10月26日晚间,美国国家航空航天罗志祥正式复出,高调宣传最新单曲,网友坚决抵制01hr罗志祥居然复出了!10月24日,他大张旗鼓推销自己的新单曲,买冬瓜。海报出街,一个词足以形容雷人。浓妆艳抹。像极小丑。更雷人的是有人扒出,这个造型疑似抄袭Lisa之前的专辑员工逃离后,富士康最新通知不再提需隔离满7天在富士康员工开始逃离两天之后,10月30日下午,富士康iDPBG郑州防疫小组连发三条通知,表达了对于员工去留自愿的尊重。我们非常理解大家急于返乡的心情!为帮助大家解决返乡问题,保证最新早安暖心话短句,早安暖心话1轻轻地,喃喃细语,诉说着无尽的爱意静静地,心心相惜,串连成缠绵的回忆缓缓地,人生漫步,成就着一生不变的传奇。爱就是牵着你的手,不离不弃!2甜言蜜语不用说,万千的幸福已在心中,千言狂买这些股!葛卫东邓晓峰冯柳周应波等投资大佬最新持股大曝光中国基金报记者吴君2022年上市公司三季报披露接近尾声,知名私募投资经理的调仓换股动作浮出水面。在今年三季度,邓晓峰新进了比亚迪,持股市值达19亿元,并且猛加仓紫金矿业,持股近72