es Elasticsearch的增删改查(含数组操作)(类型,原理) - from chatgpt

父文章 

算法中的特征的保存, es 和 mysql 和 odps hadoop hbase的区别_个人渣记录仅为自己搜索用的博客-CSDN博客

Elasticsearch如何做到数十亿数据查询毫秒级响应? - 知乎

ES系列之利用filter让你的查询效率飞起来_es filter_lucasma.eth的博客-CSDN博客

ES查询性能调优实践,亿级数据查询毫秒级返回 - 腾讯云开发者社区-腾讯云

以下是 Elasticsearch 的增删改查操作示例:

创建索引

 

PUT /my_index

{

"settings": { "number_of_shards": 1, "number_of_replicas": 1 },

"mappings": {
        "_doc": {
            "properties": {
                
                "name": {
                    "type": "keyword"
                },
                "age": {
                    "type": "long"
                },
               "birthday": {
                                  "type": "keyword",
                                   "format": "yyyy-MM-dd HH:mm:ss"
                                },
                "desc": {
                    "analyzer": "zsearch_smart",
                    "type": "text"
                },
                 "classList": {
                   "properties": {
                          "className": {
                              "type": "keyword"
                          }
                    }
                  }
              
            }
        }
    },

}

更新索引

PUT mapping_test2/_mapping 
{

"settings": { "number_of_shards": 1, "number_of_replicas": 1 },

"mappings": {
        "_doc": {
            "properties": {

             }

}

ES Mapping设置及常见参数设置 - 简书

ElasticSearch的store属性与_source_elasticsearch store的含义_自知自省的博客-CSDN博客

   当你将一个fieldstore属性设置为true,这个会在lucene层面处理. 在全文索引之外,lucene也提供了存储字段的值的特性,以支持提供id的查询(根据id得到原始信息)。通常我们在lucene层面存储的field的值是跟随search请求一起返回的(id+field的值)。

   从每一个stored field中获取值都需要一次磁盘io,如果想获取多个field的值,就需要多次磁盘io,但是,如果从_source中获取多个field的值,则只需要一次磁盘io,因为_source只是一个整体而已。所以在大多数情况下,从_source中获取是快速而高效的。

   通俗的讲: store 的意思是,是否在 _source 之外在独立存储一份,这里要说一下 _source 这是源文档,当你索引数据的时候, elasticsearch 会保存一份源文档到 _source ,如果文档的某一字段设置了 store 为 yes (默认为 no),这时候会在 _source 存储之外再为这个字段独立进行存储,这么做的目的主要是针对内容比较多的字段,放到 _source 返回的话,因为_source 是把所有字段保存为一份文档,命中后读取只需要一次 IO,包含内容特别多的字段会很占带宽影响性能,通常我们也不需要完整的内容返回(可能只关心摘要),这时候就没必要放到 _source 里一起返回了(当然也可以在查询时指定返回字段)。


————————————————
版权声明:本文为CSDN博主「自知自省」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lijingjingchn/article/details/105682618

详解Elasticsearch中 ‘store‘, ‘index‘ 属性和 ‘_all‘, ‘_source‘字段_elasticsearch中store_梦想画家的博客-CSDN博客

数据类型 - 深度

ES的数据类型_es 数据类型_BUG指挥官的博客-CSDN博客

Elasticsearch索引及字段命名规范_elasticsearch 命名规范_梦想画家的博客-CSDN博客

nested类型和object类型在数组查询中的区别

结果可以看到,当没有显示指定类型是nested时候, 这两组数据都能找出,因为数组虽然每个item都是object, 但是整个数组都是作为一个整体进行搜索匹配, 而非具体某一条数据。

Elasticsearch: object 及 nested 数据类型

Nested 类型是 object 数据类型的特殊版本,它允许对象数组以一种可以彼此独立查询的方式进行索引。在内部,嵌套对象将数组中的每个对象索引为单独的隐藏文档,这意味着每个嵌套对象都可以使用 nested query 独立于其他对象进行查询。每个 nested 对象都被索引为一个单独的 Lucene 文档。nested 数据类型能够让我们对 object 数组建立索引,并且分别进行查询。

如果需要维护数组中每个对象的关系,请使用 nested 数据类型

为了能够把我们的数据定义为nested,我们必须修改之前的索引 mapping 为:
————————————————
版权声明:本文为CSDN博主「Elastic 中国社区官方博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/UbuntuTouch/article/details/100068659

  • 如果我们在一个文档中有一个包含 4 个对象的数组,Elasticsearch 在内部将其视为 4 个不同的文档。 因此文档数量会增加,在某些情况下可能会导致计算不准确  from

Elasticsearch:Flattened 数据类型映射_数据映射_Elastic 中国社区官方博客的博客-CSDN博客

Elasticsearch使用误区—索引有上限-误用为key-value数据存储_elasticsearch是key value型数据库吗_梦想画家的博客-CSDN博客

索引字段总量 和 Elasticsearch中flattened字段类型_梦想画家的博客-CSDN博客

对于对象中的子字段默认被单独映射、索引。扁平字段类型是解决字段过多问题的另一种方法,它把整个对象映射未单个字段。给定对象,flattened 类型解析出每个子字段值作为keyword类型,对象中的内容可以通过单个查询进行搜索或聚集。对于唯一字段类型未知的情况非常有用,对于真个json对象仅创建一个映射字段,可以有效防止映射有太多的字段————映射爆炸。

另外扁平对象字段在搜索功能方面提供了一种折衷方案。只允许基本查询,不支持数字范围查询或高亮显示。
————————————————
版权声明:本文为CSDN博主「梦想画家」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/neweastsun/article/details/114290844

ES单字段支持的最大字符数_es字段长度限制_程序媛一枚~的博客-CSDN博客

Elasticsearch:Flattened 数据类型映射_数据映射_Elastic 中国社区官方博客的博客-CSDN博客

Elasticsearch:flattened 数据类型 (7.3 发行版新功能)_flattened elasticsearch_Elastic 中国社区官方博客的博客-CSDN博客

Elasticsearch 字段膨胀不要怕,Flattened 类型解千愁!_铭毅天下的博客-CSDN博客

添加文档

 


PUT my_index/_doc/xxxxx1/_create { "a":1}

重复插入从插入变成更新, 默认是没有id _create, 否则更新 

{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "xxxxx1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 41,
  "_primary_term" : 1
}

put和post区别

  1. put必须要有id, 否则报错

输入

  PUT fin_resource_allocate_dynamic/_doc/
{
 "a":1
}

输出

{
  "error": "Incorrect HTTP method for uri [/fin_resource_allocate_dynamic/_doc?pretty] and method [PUT], allowed: [POST]",
  "status": 405
}

  2. post 不加_create后缀,每次都是_create [本质原因也是1 ]

 3.   更新操作:post和put 结合id 都有覆盖功能,
              局部更新只有post才有,但需匹配_update 和 {"doc":{}} 才能有

4. _create和post put都可以结合.
1.有id有_create重复执行会报错, 幂等插入
2.有id没有_create重复执行,第一次是create,第二次是更新

错误: 手动加上_create后缀后, _creat变成了id

PUT fin_resource_allocate_dynamic/_doc/_create
{
 "a":1
}

{
  "_index" : "fin_resource_allocate_dynamic",
  "_type" : "_doc",
  "_id" : "_create",
  "_version" : 7,
  "result" : "updated",

  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 49,
  "_primary_term" : 1
}
 

replaceOrInsert

 PUT my_index/_doc/xxxxx1/ 不加后缀,第一次insert 第二次 update

 注意: POST 不加后缀,每次都是insert, 因为没有id

获取文档

ES系列之利用filter让你的查询效率飞起来_es filter_lucasma.eth的博客-CSDN博客

Elasticsearch如何做到数十亿数据查询毫秒级响应? - 知乎

ES查询性能调优实践,亿级数据查询毫秒级返回 - 腾讯云开发者社区-腾讯云

ES中的Query与Filter的区别_MarmotCoder的博客-CSDN博客

[推荐-截图]Elasticsearch 之 Filter 与 Query 有啥不同? - 知乎

id查询没有延迟

GET /my_index/_doc/1

id查询

GET fin_resource_allocate_dynamic/_search

{
  "query": {
    "ids" : {
      "values" : ["com.alipay.fdp.generalZsearchUpdateService"]
    }
  }
}

id搜索query有延迟

GET fin_resource_allocate_dynamic/_search
{ "query": {
    "match": {
       "_id":"ODC6oYcBPebeZ5KFwZ2t"
    }
  }
}

id模糊query搜索,有延迟

GET /my_index/_search

{ "query": { "wildcard": { "_id": "doc*" } } }

在此期间,该文档不能被搜索,但是我们还是可以通过 ID 使用 GET 来获得该文档。如果希望该文档能立刻被搜索,需要手动调用 refresh 操作。在 Elasticsearch 中,默认情况下 _refresh 操作设置为每秒执行一次。 详见 flush、refresh的区别 - 简书

搜索准实时

 延时原理 详见 flush、refresh的区别 - 简书Get API | Elasticsearch Guide [8.6] | Elastic

query下面可挂接 "term""terms","match","multi_match","constant_score","bool" 

"term"在"Term-level queries"目录下, Term query | Elasticsearch Guide [8.7] | Elastic

"match"在" Full text queries"目录下
Match query | Elasticsearch Guide [8.7]

boolean"在" Compound queries"目录下Boolean query | Elasticsearch Guide [8.7] | Elastic

{"query":
   {"bool":{
            "filter":[ {"term":{"_id":{"value":"${docId}"}}}]
         }
   }
}

{ "query": { "term": { "biz_id": "1909190023901225" } }

elasticsearch7常见查询(term、match、bool、filter、match)_bool字段查询 elasticsearch_Relian哈哈的博客-CSDN博客

模糊查询

GET /my_index/_search { "query": { "wildcard": { "orders.items.name": "*Product*" } } }

多层级嵌套数组查询

GET /my_index/_search { "query": {

    "nested": { "path": "orders",

       "query": {

         "nested": { "path": "orders.items", "query": { "wildcard": { "orders.items.name": "*Product*" } } } } } } }

分页查询和优化

深度分页总结

假设我们有一个包含大量文档的 Elasticsearch 索引,我们想要对这些文档进行分页查询。传统的分页查询方式是使用 fromsize 参数来指定要返回的文档范围。但是,这种方式在处理大量文档时可能会变得很慢,因为 Elasticsearch 需要在每次查询时重新计算文档的位置。

为了优化分页查询,我们可以使用上一次查询的最后一项作为下一次查询的起点。这种方式可以避免 Elasticsearch 重新计算文档的位置,从而提高查询性能。

以下是一个使用上一次最后一项进行分页优化的 Elasticsearch 查询示例:

GET /my_index/_search {

"query": { "match_all": {} },

"sort": [ { "created_at": "desc" } ],

"size": 10,

"search_after": [1546300800000] }

在这个查询中,我们使用 sort 参数按照 created_at 字段的降序排列结果。然后,我们使用 size 参数指定每页返回的文档数量为 10。最后,我们使用 search_after 参数指定上一次查询的最后一项,这样 Elasticsearch 就可以使用它作为下一次查询的起点。

使用上一次最后一项进行分页优化可以显著提高 Elasticsearch 查询性能,特别是在处理大量文档时。

注意 es里的文档, key不能是动态生成拼接的, 否则很容易超过index上限, 报错 Limit of total fields [1000] in index [ ] has been exceeded

更新文档局部字段 - 不要忘了 "doc", 否则就是覆盖

本质上 Lucene 不支持部分更新

  请注意,Lucene的部分更新是基于文档级别的,因此您需要在更新文档时提供完整的文档内容。如果您只想更新文档的部分内容,您需要在更新前获取完整的文档内容,并将要更新的字段合并到新文档中。

 所以大文档的更新对es , 性能不是特别好

POST fin_resource_allocate_dynamic/_doc/ODC6oYcBPebeZ5KFwZ2t/_update
{ "doc":{    "b":2} }

如果结构变更, 那么会抛错. 数组-String不会.

"field_not_config" : "1", -> "field_not_config" : ["1"],

"field_not_config" : "1", -> "field_not_config" : [1],  字符串变数字 ,可以, 进行了 封包,拆装. 更新允许,但不建议.

但是 "field_not_config" : "1", -> "field_not_config" : {"key": "1"}

但是String变map会. 数组不是类型.

    host [http://xx.x.net:12345], URI [/inst_xxx_test/_doc/antc.fin.allocate-v1-PLATFORM-FIN_RES_ALLOCATE-outRequestNo/_update], status line [HTTP/1.1 400 Bad Request]
通过    GET inst_xxx_test/_mapping 可以知道  

#! Deprecation: 299 Elasticsearch-6.8.6-4268ecc "[types removal] The parameter include_type_name should be explicitly specified in get mapping requests to prepare for 7.0. In 7.0 include_type_name will default to 'false', which means responses will omit the type name in mapping definitions."
{"inst_xxx_test" : {"mappings" : {"_doc" : {"_all" : {"enabled" : false},"dynamic_templates" : [{"strings" : {"match_mapping_type" : "string","mapping" : {"type" : "keyword"}}}],"properties" : {"field_not_config" : {"type" : "keyword"}}}}}
}

 报错_update放中间

POST my_index/_update/ODC6oYcBPebeZ5KFwZ2t

{
  "error": {
    "root_cause": [
      {
        "type": "invalid_type_name_exception",
        "reason": "Document mapping type name can't start with '_', found: [_update]"
      }
    ],
    "type": "invalid_type_name_exception",
    "reason": "Document mapping type name can't start with '_', found: [_update]"
  },
  "status": 400
}

 POST /my_index/_update/1 { "doc": { "title": "Elasticsearch 101 - Updated" } } 

报错: update 放中间

POST my_index/update/ODC6oYcBPebeZ5KFwZ2t

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "Rejecting mapping update to [my_index] as the final mapping would have more than 1 type: [_doc, update]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "Rejecting mapping update to [my_index] as the final mapping would have more than 1 type: [_doc, update]"
  },
  "status": 400
}

报错: _update后缀,但内容里没有"doc"


POST fin_resource_allocate_dynamic/_doc/ODC6oYcBPebeZ5KFwZ2t/_update
{
  "b":3,
  "c":6

}

{
  "error": {
    "root_cause": [
      {
        "type": "action_request_validation_exception",
        "reason": "Validation Failed: 1: script or doc is missing;"
      }
    ],
    "type": "action_request_validation_exception",
    "reason": "Validation Failed: 1: script or doc is missing;"
  },
  "status": 400
}

报错: 不支持post 加_update后缀

put fin_resource_allocate_dynamic/_doc/ODC6oYcBPebeZ5KFwZ2t/_update
{
    "b":4
}

{
  "error": {
    "type": "illegal_argument_exception",
    "reason": "No endpoint or operation is available at [PUT /fin_resource_allocate_dynamic/_doc/ODC6oYcBPebeZ5KFwZ2t/_update?pretty]"
  },
  "status": 400
}

删除文档

 

DELETE /my_index/_doc/1

搜索文档

 

GET /my_index/_search { "query": { "match": { "title": "Elasticsearch" } } }

以上操作的结果可以通过 Elasticsearch 的 API 返回,例如:

 

{ "_index": "my_index", "_type": "_doc", "_id": "1", "_version": 2, "result": "updated", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 1, "_primary_term": 1 }

这个结果表示文档已经被更新,并且版本号从 1 变成了 2。

数组更新

Elasticsearch中的一个文档可以包含多个嵌套的字段和数组。当需要修改一个数组文档时,可以使用以下两种方法:

  1. 部分更新:

部分文档更新可以使用Update API执行,通过提交包含仅需要包含要更新字段的JSON数据块,进行更新。在JSON数据中指定当前数组项,例如,要更新数组items的第二个项目:

POST /myindex/mytype/1/_update { "doc": { "items.2": "new value" } }

这将替换第二项为新值,不需要重写拥有不变值的所有内容。

  1. 全部更新:

如果需要直接替换原有的整个数组,可以使用index API执行全文档的更新,此时新文档必须包含或重新定义完整的嵌套结构

PUT my_index/my_type/1?refresh=true
{"name":    "John Doe","age":    33,"items": [ "beijing”, “shanghan”, ”shenzhen”]
}

在上例中,原有的items字段被替换成新的值。

数组添加

下面是一个示例,在Elasticsearch中创建一个文档mydoc,其中items是数组字段:

 

PUT /myindex/mytype/1 { "items": ["apple", "banana", "peach"] }

现在,我们可以通过查询该文档来展示原始文档:

 

GET /myindex/mytype/1

items数组添加一个新元素orange

POST /myindex/mytype/1/_update { "script": { "source": "ctx._source.items.add(params.newitem)", "params": { "newitem": "orange" } } }

同样,我们可以用GET请求来显示文档:

GET /myindex/mytype/1

此时获取到的文档会包含orange这个新加的元素。

数组查询

nested类型和object类型在数组查询中的区别

结果可以看到,当没有显示指定类型是nested时候, 这两组数据都能找出,因为数组虽然每个item都是object, 但是整个数组都是作为一个整体进行搜索匹配, 而非具体某一条数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18246.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文心一言对比chatgpt

文章目录 一、 介绍二、 回复速度比较三、 写代码能力四、 做表格能力五、 写文案能力六、 解决数学问题能力七、 绘画能力八、 实时更新信息九、 总结 一、 介绍 文心一言对比chatgpt。 测试了上百个案例,挑选几个经典的案例。 二、 回复速度比较 百度文心耗时10…

CSDN chatGPT初体验

我的问题:用java实现一个B树 public class BTree {private int t;private Node root;private class Node {private int n;private boolean leaf;private int[] keys;private Node[] children;public Node(boolean leafNode) {this.n 0;this.leaf leafNode;this.ke…

chatgpt赋能python:Python岗位需求日渐增加

Python岗位需求日渐增加 Python编程语言在当前的IT行业中越来越受欢迎。其灵活性和易用性使得Python在各种领域中使用广泛,比如Web开发、数据科学、人工智能等。作为一名有10年Python编程经验的工程师,我认为Python是一种非常有前途的编程语言&#xff…

ChatGPT可能被滥用于网络犯罪

科技是一把双刃剑 ChatGPT一经发布,短时间内就成为了现象级的应用。其清晰明确的回答和丰富的知识,昭示着AI技术造福人类,彻底简化我们生活工作这一美好的未来愿景。对于解决各行各业的许多问题,ChatGPT也提供了另外一种思路&…

用ChatGPT构建网络设备表,并根据设备关系生成网络拓扑

构造一个数据表,存储包括交换机、路由器、防火墙、入侵检测、上网行为管理等设备的编号、序列号、IP、MAC、访问地址、用户名、密码、管理员、物理位置、上联设备ip等信息 下面是一个示例数据表: Device IDSerial NumberIPMACAccess URLUsernamePassword…

七大语言模型“偏见与毒性”的角逐,ChatGpt3.5综合表现优良

颠覆性的技术进步和人工智能的快速发展,催生了现如今LLM(大型语言模型)和AIGC(AI生成内容)的盛行。这些创新性的模型和算法不仅能够理解、生成和处理人类语言,还能够模拟智能思维和创造力,成为各…

阿里版ChatGPT已接入钉钉,张勇:未来所有业务都有大模型加持

机器之心报道 机器之心编辑部 阿里:大模型也是基础设施。 4 月 7 日下午,阿里云没有一点预告的突然宣布,自研类 ChatGPT 产品开启企业邀测,模型名为「通义千问」。 虽然是非常小范围的测试,但邀测消息刚放出&#xff…

阿里巴巴开源Chat2DB v1.0.11 初体验

阿里巴巴开源Chat2DB v1.0.11 初体验 前言什么是Chat2DB下载安装安装配置Chat2DB初体验配置数据源准备测试数据认识几个功能菜单开始测试自然语言转SQLSQL解释SQL优化 使用总结后续功能结语 前言 作为一名阿里巴巴开源项目的拥护者,从Chat2DB开源至今都有关注这个开…

估值 2 个月从 11 亿美元降到 3 亿美元,投资人清仓跑路,国产大模型创业遇冷...

图片来源:由无界 AI生成 创业未半,而中道崩殂。 6 月 29 日,美团发布公告以 20.65 亿元全资收购光年之外全部权益,距离光年之外正式营业刚过去 84 天。 这是目前中国大模型创业领域最大的收购案,光年之外也在 4 个月时…

英伟达帝国的一道裂缝

2012年,AI圈发生了两件大事,按时间顺序,第一件是谷歌组团已久的Google Brain发布“出道作”——一个能够识别猫的深度学习网络“谷歌猫”,74.8%的识别准确率,比知名识别图像大赛ImageNet前一年获胜算法的74%还要高出0.…

也谈“前端已死”

一、一些迹象 逛社区,偶然看到了这张图片: 嗯……我眉头一皱,久久不语,心想,有这么夸张吗,假的吧? 突然想到,最近我在社区发了个前端招聘的信息,结果简历漫天纷飞&…

写文、画图、替人直播,小巨头混战AIGC

文|光锥智能,作者|黄小艺、郝鑫,编辑|刘雨琦 大模型的春风,吹乱了内容平台们的心。 作为“被革命”的第一梯队,内容平台们跃跃欲试,欲抢占时间窗口。 5月6日,小红书被曝…

AI来势汹汹,这份「生存计划」请查收!

AIGC即人工智能生产内容,最近可太火了,但是火了这么久,有些人都没明白到底为什么火?甚至不明所以觉得“AI替代XX”,小编认为没必要焦虑,一起来看一下吧。 AI工具们一日千张图、3小时写一本书、2分钟构建一个…

“前端已死”

一、一些迹象 逛社区,偶然看到了这张图片: 嗯……我眉头一皱,久久不语,心想,有这么夸张吗,假的吧? 突然想到,最近我在社区发了个前端招聘的信息,结果简历漫天纷飞&…

爆肝一晚上,我总结了 2023 年程序员必学的 Prompt Engineering 高杠杆技术!

前言 大家好,我是「周三不Coding」。 众所周知,程序员不能失去 ChatGPT,就像西方不能失去耶路撒冷。 ChatGPT 的爆火也使得 Prompt Engineering 这门技术为众人熟知。 短期来看,Prompt Engineering 是一门高杠杆技术&#xff…

chat GPT 能给普通人带来什么机会?

最近全网爆火的chat GPT 相信大家都有点了解,今天给大家一些参考:其实23年年初我就被一个朋友推荐了ChatGPT,当时他说让我体验下,说实话之前也被不少(假,或者半成品)AI技术糊弄过,也…

吹上天的AIGC,就业情况到底如何

猎聘大数据研究院重磅发布《AIGC就业趋势大数据报告2023》,招聘平均年薪已达40万,博士需求量同比增长超100%。 不用赘述,大家都知道,最近半年ChatGPT是有多么火爆。 随着ChatGPT的全球爆火,AIGC也已成功从科技领域破…

百度云首次实现季度盈利;OpenAI 或将发布新的开源语言模型;苹果已注册 xrOS 系统商标|极客头条

「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews) 一分钟速览新闻点&…

ChatGPT推出仅2个月活跃用户过亿 可胜任谷歌18.3万美元年薪工作

雷递网 雷建平 2月3日 据外媒披露,来自OpenAI流行聊天机器人 ChatGPT 在推出两个月后,估计在1月已达到1亿月活跃用户,使其成为历史上增长最快的消费者应用程序。 该报告援引分析公司Similarweb的数据称,1 月份平均每天约有 1300 万…

一些可以参考的文档集合13

之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合4_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合5_…