快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

关于es与sqlserver的信息

ES与传统数据库的比较

1.结构名称不同

10年的兴庆网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站建设的优势是能够根据用户设备显示端的尺寸不同,自动调整兴庆建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联从事“兴庆网站设计”,“兴庆网站推广”以来,每个客户项目都认真落实执行。

2.ES分布式搜索,传统数据库遍历式搜索

3.ES采用倒排索引,传统数据库采用B+树索引

4.ES没有用户验证和权限控制

5.ES没有事务的概念,不支持回滚,误删不能恢复

6.ES免费,完全开源;传统数据库部分免费

有关更详细的比较内容,可以到黑马程序员官网找到社区技术文章,找不到可以对话框问一下。里面还有结合工作的举例。

ES 与 TS

ES6 是一种 JS 的规范化, JS 是 ES 的拓展。

TS 是一种 JS 的类型补充。

Web 中的 JS = ES + Web API ( DOM + BOM )

Node 中的 JS = ES + Node API ( fs + Net + etc )

TS = JS + 类型系统

如下图 3.1

ES6 中推出了两个新的关键字 let 、const 。

因为 var 存在变量提升,所以在定义之前调用变量不会报错,而是会得到一个 undefined 。这在很多编码过程中看来,是不合理的,因为变量先定义后使用,才是符合正常的思维逻辑的。故而推出了两个关键字 let 、const 。

两者都没有变量提升,因为闭包机制, 所以只在声明位置所属的块作用域内生效。

Proxy  可以理解为监听器 , 拦截器, 可以修改对象原本的方法。可以通过构造函数的方法使用,也可以在对象内部定义为  Proxy  属性的方式来调用。

Proxy 两种使用方法

Proxy  传入两个参数,都是对象格式。  target  是被拦截的对象, handler  中盛放了拦截 target  的方法。如果被拦截的对象是一个空对象,那么在使用构造函数调用时候,可以用构造对象调用拦截方法会产生相同效果。

target为空对象情况

Reflect

Reflect  是一种新的  API  ,将Object对象的属于语言内部的方法放到 Reflect  对象上,即从  Reflect  对象上拿  Object  对象内部方法。

将用老  Object  方法报错的情况,改为返回  false 。

让 Object  操作变成函数行为。

Reflect  和  Proxy  有着一样的方法,两者可以相辅相成 。

图片引自阮一峰 ES6

这样的操作使得拦截操作更为合理,把拦截的操作交给  Reflect  ,而  Proxy  的功能主要为输出日志。

Set   不重复集合。

Symbol 具有唯一性,可以作为对象的 key ,避免重复。

生成器 Generator : 内部可以通过 yeld 来分步执行。返回一个对象 { value, done}。

es使用与原理6 -- 聚合分析剖析

有些聚合分析的算法,是很容易就可以并行的,比如说max

有些聚合分析的算法,是不好并行的,比如说,count(distinct),并不是说,在每个node上,直接就出一些distinct value,就可以的,因为数据可能会很多,假设图中的协调节点3百万个数据去重后还剩下100万distinct的数据,那么内存需要来存储这100万条数据,这是不可能的

es会采取近似聚合的方式,就是采用在每个node上进行近估计的方式,得到最终的结论,cuont(distcint),100万,1050万/95万 -- 5%左右的错误率

近似估计后的结果,不完全准确,但是速度会很快,一般会达到完全精准的算法的性能的数十倍

precision_threshold优化准确率和内存开销

brand去重,如果brand的unique value,在100个以内,小米,长虹,三星,TCL,HTL。。。

在多少个unique value以内,cardinality,几乎保证100%准确

cardinality算法,会占用precision_threshold * 8 byte 内存消耗,100 * 8 = 800个字节

占用内存很小。。。而且unique value如果的确在值以内,那么可以确保100%准确

100,数百万的unique value,错误率在5%以内

precision_threshold,值设置的越大,占用内存越大,1000 * 8 = 8000 / 1000 = 8KB,可以确保更多unique value的场景下,100%的准确

field,去重,count,这时候,unique value,10000,precision_threshold=10000,10000 * 8 = 80000个byte,80KB

doc value正排索引

搜索+聚合 是怎么实现的?

假设是倒排索引实现的

倒排索引来实现是非常不现实的,因为我们搜索的那个字段search_field 有可能是分词的,这就需要去扫描整个索引才能实现聚合操作,效率是及其低下的。

正排索引结构:

doc2: agg1

doc3: agg2

1万个doc -- 搜 - 可能跟搜索到10000次,就搜索完了,就找到了1万个doc的聚合field的所有值了,然后就可以执行分组聚合操作了

doc value原理

1、doc value原理

(1)index-time生成

PUT/POST的时候,就会生成doc value数据,也就是正排索引

(2)核心原理与倒排索引类似

正排索引,也会写入磁盘文件中,然后呢,os cache先进行缓存,以提升访问doc value正排索引的性能

如果os cache内存大小不足够放得下整个正排索引,doc value,就会将doc value的数据写入磁盘文件中

(3)性能问题:给jvm更少内存,64g服务器,给jvm最多16g

es官方是建议,es大量是基于os cache来进行缓存和提升性能的,不建议用jvm内存来进行缓存,那样会导致一定的gc开销和oom问题

给jvm更少的内存,给os cache更大的内存

64g服务器,给jvm最多16g,几十个g的内存给os cache

os cache可以提升doc value和倒排索引的缓存和查询效率

2、column压缩

doc1: 550

doc2: 550

doc3: 500

合并相同值,550,doc1和doc2都保留一个550的标识即可

(1)所有值相同,直接保留单值

(2)少于256个值,使用table encoding模式:一种压缩方式

(3)大于256个值,看有没有最大公约数,有就除以最大公约数,然后保留这个最大公约数

重点:

对分词的field,直接执行聚合操作,会报错,大概意思是说,你必须要打开fielddata,然后将正排索引数据加载到内存中,才可以对分词的field执行聚合操作,而且会消耗很大的内存

先修改 字段的fielddata属性为true,再查 就能查找到数据

当然,我们也可以使用内置field(keyword)不分词,对string field进行聚合,如果对不分词的field执行聚合操作,直接就可以执行,不需要设置fieldata=true

分词field+fielddata的工作原理

doc value -- 不分词的所有field,可以执行聚合操作 -- 如果你的某个field不分词,那么在index-time,就会自动生成doc value -- 针对这些不分词的field执行聚合操作的时候,自动就会用doc value来执行

分词field,是没有doc value的。。。在index-time,如果某个field是分词的,那么是不会给它建立doc value正排索引的,因为分词后,占用的空间过于大,所以默认是不支持分词field进行聚合的

分词field默认没有doc value,所以直接对分词field执行聚合操作,是会报错的

对于分词field,必须打开和使用fielddata,完全存在于纯内存中。。。结构和doc value类似。。。如果是ngram或者是大量term,那么必将占用大量的内存。。。

如果一定要对分词的field执行聚合,那么必须将fielddata=true,然后es就会在执行聚合操作的时候,现场将field对应的数据,建立一份fielddata正排索引,fielddata正排索引的结构跟doc value是类似的,

但是只会讲fielddata正排索引加载到内存中来,然后基于内存中的fielddata正排索引执行分词field的聚合操作

如果直接对分词field执行聚合,报错,才会让我们开启fielddata=true,告诉我们,会将fielddata uninverted index,正排索引,加载到内存,会耗费内存空间

为什么fielddata必须在内存?因为大家自己思考一下,分词的字符串,需要按照term进行聚合,需要执行更加复杂的算法和操作,如果基于磁盘和os cache,那么性能会很差

我们是不是可以预先生成加载fielddata到内存中来???

query-time的fielddata生成和加载到内存,变为index-time,建立倒排索引的时候,会同步生成fielddata并且加载到内存中来,这样的话,对分词field的聚合性能当然会大幅度增强


网页标题:关于es与sqlserver的信息
分享网址:http://6mz.cn/article/hdopgg.html

其他资讯