-
Elasticsearch下载安装
2019-07-31 19:26:09注:Elasticsearch 需要 Java 8 环境,在安装Elasticsearch之前先安装好JDK。 1、Windows版 1.1、下载 访问官网的下载地址:https://www.elastic.co/downloads/elasticsearch,windows版的下载ZIP格式的。 如果...注:Elasticsearch 需要 Java 8 环境,在安装Elasticsearch之前先安装好JDK。
1、Windows版
1.1、下载
访问官网的下载地址:https://www.elastic.co/downloads/elasticsearch,windows版的下载ZIP格式的。
如果不想下载最新版的,可以点击“past releases”选择过去的版本。我这里下载的是6.2.4版本的。
1.2、解压
解压下载的压缩包,比如我这里是解压到了D盘根目录,会出现D:\elasticsearch-6.2.4文件夹。
1.3、启动
进入elasticsearch的bin目录,双击elasticsearch.bat启动服务,默认端口是9200,如下图:
启动完成之后,在浏览器中访问http://localhost:9200/,出现如下图所示内容表明Elasticsearch启动成功。
2、linux版(centos7)
2.1、下载
可以按照windows版那样从官网下载TAR格式解压包,上传到linux服务器上。
如果你的linux可以访问外网的话,推荐直接在linux中下载,执行如下命令:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz
2.2、解压
执行解压命令:
tar -zxvf elasticsearch-6.2.4.tar.gz
解压完成后,会出现elasticsearch-6.2.4目录。
2.3、启动
执行启动命令:
./bin/elasticsearch
如果你是root用户启动的话,会报"can not run elasticsearch as root"的错误。因为安全问题elasticsearch不让用root用户直接运行,所以要创建新用户,继续阅读2.4步骤。
2.4、创建新用户
第一步:liunx创建新用户:"adduser yjclsx",然后给创建的用户加密码:"passwd yjclsx",输入两次密码。
第二步:切换刚才创建的用户:"su yjclsx",然后启动elasticsearch。如果显示Permission denied权限不足,则继续进行第三步。
第三步:给新用户赋权限,因为这个用户本身就没有权限,肯定自己不能给自己付权限。所以要用root用户登录并赋予权限,chown -R yjclsx/你的elasticsearch安装目录。
通过上面三步就可以启动elasticsearch了。
2.5、验证启动是否成功
如果一切正常,Elasticsearch就会在默认的9200端口运行。这时,打开另一个命令行窗口,请求该端口:
curl localhost:9200
如果得到如下的返回,就说明启动成功了:
2.6、远程访问elasticsearch服务
默认情况下,Elasticsearch 只允许本机访问,如果需要远程访问,可以修改 Elasticsearch 安装目录中的config/elasticsearch.yml文件,去掉network.host的注释,将它的值改成0.0.0.0,让任何人都可以访问,然后重新启动 Elasticsearch 。
network.host: 0.0.0.0
上面代码中,"network.host:"和"0.0.0.0"中间有个空格,不能忽略,不然启动会报错。线上服务不要这样设置,要设成具体的 IP。
2.7、常见错误及其解决方式
错误一:max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
解决:执行下面的命令:
sudo sysctl -w vm.max_map_count=262144
错误二:max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
解决:执行下面的命令:
sudo vim /etc/security/limits.conf
在limits.conf最下方加入下面两行(这里的yjclsx是之前2.4步骤中新建的用户名):
yjclsx hard nofile 65536 yjclsx soft nofile 65536
-
Elasticsearch配置文件(elasticsearch.yml)详解
2019-07-31 19:26:52##################### Elasticsearch Configuration Example ##################### # # 只是挑些重要的配置选项进行注释,其实自带的已经有非常细致的英文注释了! # https://www.elastic.co/g...##################### Elasticsearch Configuration Example ##################### # # 只是挑些重要的配置选项进行注释,其实自带的已经有非常细致的英文注释了! # https://www.elastic.co/guide/en/elasticsearch/reference/current/modules.html # ################################### Cluster ################################### # 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的. # es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。 # cluster.name可以确定你的集群名称,当你的elasticsearch集群在同一个网段中elasticsearch会自动的找到具有相同cluster.name的elasticsearch服务. # 所以当同一个网段具有多个elasticsearch集群时cluster.name就成为同一个集群的标识. # cluster.name: elasticsearch #################################### Node ##################################### # https://www.elastic.co/guide/en/elasticsearch/reference/5.1/modules-node.html#master-node # 节点名称同理,可自动生成也可手动配置. # node.name: node-1 # 允许一个节点是否可以成为一个master节点,es是默认集群中的第一台机器为master,如果这台机器停止就会重新选举master. # node.master: true # 允许该节点存储数据(默认开启) # node.data: true # 配置文件中给出了三种配置高性能集群拓扑结构的模式,如下: # 1. 如果你想让节点从不选举为主节点,只用来存储数据,可作为负载器 # node.master: false # node.data: true # node.ingest: false # 2. 如果想让节点成为主节点,且不存储任何数据,并保有空闲资源,可作为协调器 # node.master: true # node.data: false # node.ingest: false # 3. 如果想让节点既不称为主节点,又不成为数据节点,那么可将他作为搜索器,从节点中获取数据,生成搜索结果等 # node.master: false # node.data: false # node.ingest: true (可不指定默认开启) # 4. 仅作为协调器 # node.master: false # node.data: false # node.ingest: false # 监控集群状态有一下插件和API可以使用: # Use the Cluster Health API [http://localhost:9200/_cluster/health], the # Node Info API [http://localhost:9200/_nodes] or GUI tools # such as <http://www.elasticsearch.org/overview/marvel/>, # <http://github.com/karmi/elasticsearch-paramedic>, # <http://github.com/lukas-vlcek/bigdesk> and # <http://mobz.github.com/elasticsearch-head> to inspect the cluster state. # A node can have generic attributes associated with it, which can later be used # for customized shard allocation filtering, or allocation awareness. An attribute # is a simple key value pair, similar to node.key: value, here is an example: # 每个节点都可以定义一些与之关联的通用属性,用于后期集群进行碎片分配时的过滤 # node.rack: rack314 # 默认情况下,多个节点可以在同一个安装路径启动,如果你想让你的es只启动一个节点,可以进行如下设置 # node.max_local_storage_nodes: 1 #################################### Index #################################### # 设置索引的分片数,默认为5 #index.number_of_shards: 5 # 设置索引的副本数,默认为1: #index.number_of_replicas: 1 # 配置文件中提到的最佳实践是,如果服务器够多,可以将分片提高,尽量将数据平均分布到大集群中去 # 同时,如果增加副本数量可以有效的提高搜索性能 # 需要注意的是,"number_of_shards" 是索引创建后一次生成的,后续不可更改设置 # "number_of_replicas" 是可以通过API去实时修改设置的 #################################### Paths #################################### # 配置文件存储位置 # path.conf: /path/to/conf # 数据存储位置(单个目录设置) # path.data: /path/to/data # 多个数据存储位置,有利于性能提升 # path.data: /path/to/data1,/path/to/data2 # 临时文件的路径 # path.work: /path/to/work # 日志文件的路径 # path.logs: /path/to/logs # 插件安装路径 # path.plugins: /path/to/plugins #################################### Plugin ################################### # 设置插件作为启动条件,如果一下插件没有安装,则该节点服务不会启动 # plugin.mandatory: mapper-attachments,lang-groovy ################################### Memory #################################### # 当JVM开始写入交换空间时(swapping)ElasticSearch性能会低下,你应该保证它不会写入交换空间 # 设置这个属性为true来锁定内存,同时也要允许elasticsearch的进程可以锁住内存,linux下可以通过 `ulimit -l unlimited` 命令 # bootstrap.mlockall: true # 确保 ES_MIN_MEM 和 ES_MAX_MEM 环境变量设置为相同的值,以及机器有足够的内存分配给Elasticsearch # 注意:内存也不是越大越好,一般64位机器,最大分配内存别才超过32G ############################## Network And HTTP ############################### # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0 # network.bind_host: 192.168.0.1 # 设置其它节点和该节点交互的ip地址,如果不设置它会自动设置,值必须是个真实的ip地址 # network.publish_host: 192.168.0.1 # 同时设置bind_host和publish_host上面两个参数 # network.host: 192.168.0.1 # 设置节点间交互的tcp端口,默认是9300 # transport.tcp.port: 9300 # 设置是否压缩tcp传输时的数据,默认为false,不压缩 # transport.tcp.compress: true # 设置对外服务的http端口,默认为9200 # http.port: 9200 # 设置请求内容的最大容量,默认100mb # http.max_content_length: 100mb # 使用http协议对外提供服务,默认为true,开启 # http.enabled: false ###################### 使用head等插件监控集群信息,需要打开以下配置项 ########### # http.cors.enabled: true # http.cors.allow-origin: "*" # http.cors.allow-credentials: true ################################### Gateway ################################### # gateway的类型,默认为local即为本地文件系统,可以设置为本地文件系统 # gateway.type: local # 下面的配置控制怎样以及何时启动一整个集群重启的初始化恢复过程 # (当使用shard gateway时,是为了尽可能的重用local data(本地数据)) # 一个集群中的N个节点启动后,才允许进行恢复处理 # gateway.recover_after_nodes: 1 # 设置初始化恢复过程的超时时间,超时时间从上一个配置中配置的N个节点启动后算起 # gateway.recover_after_time: 5m # 设置这个集群中期望有多少个节点.一旦这N个节点启动(并且recover_after_nodes也符合), # 立即开始恢复过程(不等待recover_after_time超时) # gateway.expected_nodes: 2 ############################# Recovery Throttling ############################# # 下面这些配置允许在初始化恢复,副本分配,再平衡,或者添加和删除节点时控制节点间的分片分配 # 设置一个节点的并行恢复数 # 1.初始化数据恢复时,并发恢复线程的个数,默认为4 # cluster.routing.allocation.node_initial_primaries_recoveries: 4 # 2.添加删除节点或负载均衡时并发恢复线程的个数,默认为2 # cluster.routing.allocation.node_concurrent_recoveries: 2 # 设置恢复时的吞吐量(例如:100mb,默认为0无限制.如果机器还有其他业务在跑的话还是限制一下的好) # indices.recovery.max_bytes_per_sec: 20mb # 设置来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5 # indices.recovery.concurrent_streams: 5 # 注意: 合理的设置以上参数能有效的提高集群节点的数据恢复以及初始化速度 ################################## Discovery ################################## # 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点.默认为1,对于大的集群来说,可以设置大一点的值(2-4) # discovery.zen.minimum_master_nodes: 1 # 探查的超时时间,默认3秒,提高一点以应对网络不好的时候,防止脑裂 # discovery.zen.ping.timeout: 3s # For more information, see # <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-zen.html> # 设置是否打开多播发现节点.默认是true. # 当多播不可用或者集群跨网段的时候集群通信还是用单播吧 # discovery.zen.ping.multicast.enabled: false # 这是一个集群中的主节点的初始列表,当节点(主节点或者数据节点)启动时使用这个列表进行探测 # discovery.zen.ping.unicast.hosts: ["host1", "host2:port"] # Slow Log部分与GC log部分略,不过可以通过相关日志优化搜索查询速度 ################ X-Pack ########################################### # 官方插件 相关设置请查看此处 # https://www.elastic.co/guide/en/x-pack/current/xpack-settings.html # ############## Memory(重点需要调优的部分) ################ # Cache部分: # es有很多种方式来缓存其内部与索引有关的数据.其中包括filter cache # filter cache部分: # filter cache是用来缓存filters的结果的.默认的cache type是node type.node type的机制是所有的索引内部的分片共享filter cache.node type采用的方式是LRU方式.即:当缓存达到了某个临界值之后,es会将最近没有使用的数据清除出filter cache.使让新的数据进入es. # 这个临界值的设置方法如下:indices.cache.filter.size 值类型:eg.:512mb 20%。默认的值是10%。 # out of memory错误避免过于频繁的查询时集群假死 # 1.设置es的缓存类型为Soft Reference,它的主要特点是据有较强的引用功能.只有当内存不够的时候,才进行回收这类内存,因此在内存足够的时候,它们通常不被回收.另外,这些引用对象还能保证在Java抛出OutOfMemory异常之前,被设置为null.它可以用于实现一些常用图片的缓存,实现Cache的功能,保证最大限度的使用内存而不引起OutOfMemory.在es的配置文件加上index.cache.field.type: soft即可. # 2.设置es最大缓存数据条数和缓存失效时间,通过设置index.cache.field.max_size: 50000来把缓存field的最大值设置为50000,设置index.cache.field.expire: 10m把过期时间设置成10分钟. # index.cache.field.max_size: 50000 # index.cache.field.expire: 10m # index.cache.field.type: soft # field data部分&&circuit breaker部分: # 用于fielddata缓存的内存数量,主要用于当使用排序,faceting操作时,elasticsearch会将一些热点数据加载到内存中来提供给客户端访问,但是这种缓存是比较珍贵的,所以对它进行合理的设置. # 可以使用值:eg:50mb 或者 30%(节点 node heap内存量),默认是:unbounded #indices.fielddata.cache.size: unbounded # field的超时时间.默认是-1,可以设置的值类型: 5m #indices.fielddata.cache.expire: -1 # circuit breaker部分: # 断路器是elasticsearch为了防止内存溢出的一种操作,每一种circuit breaker都可以指定一个内存界限触发此操作,这种circuit breaker的设定有一个最高级别的设定:indices.breaker.total.limit 默认值是JVM heap的70%.当内存达到这个数量的时候会触发内存回收 # 另外还有两组子设置: #indices.breaker.fielddata.limit:当系统发现fielddata的数量达到一定数量时会触发内存回收.默认值是JVM heap的70% #indices.breaker.fielddata.overhead:在系统要加载fielddata时会进行预先估计,当系统发现要加载进内存的值超过limit * overhead时会进行进行内存回收.默认是1.03 #indices.breaker.request.limit:这种断路器是elasticsearch为了防止OOM(内存溢出),在每次请求数据时设定了一个固定的内存数量.默认值是40% #indices.breaker.request.overhead:同上,也是elasticsearch在发送请求时设定的一个预估系数,用来防止内存溢出.默认值是1 # Translog部分: # 每一个分片(shard)都有一个transaction log或者是与它有关的预写日志,(write log),在es进行索引(index)或者删除(delete)操作时会将没有提交的数据记录在translog之中,当进行flush 操作的时候会将tranlog中的数据发送给Lucene进行相关的操作.一次flush操作的发生基于如下的几个配置 #index.translog.flush_threshold_ops:当发生多少次操作时进行一次flush.默认是 unlimited #index.translog.flush_threshold_size:当translog的大小达到此值时会进行一次flush操作.默认是512mb #index.translog.flush_threshold_period:在指定的时间间隔内如果没有进行flush操作,会进行一次强制flush操作.默认是30m #index.translog.interval:多少时间间隔内会检查一次translog,来进行一次flush操作.es会随机的在这个值到这个值的2倍大小之间进行一次操作,默认是5s #index.gateway.local.sync:多少时间进行一次的写磁盘操作,默认是5s
-
ElasticSearch简介
2019-05-18 08:51:31摘自Elasticsearch-基础介绍及索引原理分析 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单...Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:
- 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
- 实时分析的分布式搜索引擎。
- 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
一、基本概念
先说Elasticsearch的文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:
{ "name" : "John", "sex" : "Male", "age" : 25, "birthDate": "1990/05/01", "about" : "I love to go rock climbing", "interests": [ "sports", "music" ] }
用Mysql这样的数据库存储就会容易想到建立一张User表,有balabala的字段等,在Elasticsearch里这就是一个文档,当然这个文档会属于一个User的类型,各种各样的类型存在于一个索引当中。
这里有一份简易的将Elasticsearch和关系型数据术语对照表:
关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns) Elasticsearch ⇒ 索引(Index) ⇒ 类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields)
一个 Elasticsearch 集群可以包含多个索引(数据库),也就是说其中包含了很多类型(表)。这些类型中包含了很多的文档(行),然后每个文档中又包含了很多的字段(列)。Elasticsearch的交互,可以使用Java API,也可以直接使用HTTP的Restful API方式,比如我们打算插入一条记录,可以简单发送一个HTTP的请求:
PUT /megacorp/employee/1 { "name" : "John", "sex" : "Male", "age" : 25, "about" : "I love to go rock climbing", "interests": [ "sports", "music" ] }
更新,查询也是类似这样的操作。
二、 索引
Elasticsearch最关键的就是提供强大的索引能力。
Elasticsearch索引的精髓:
一切设计都是为了提高搜索的性能
另一层意思:为了提高搜索的性能,难免会牺牲某些其他方面,比如插入/更新,否则其他数据库不用混了。前面看到往Elasticsearch里插入一条记录,其实就是直接PUT一个json的对象,这个对象有多个fields,比如上面例子中的name, sex, age, about, interests,那么在插入这些数据到Elasticsearch的同时,Elasticsearch还默默1的为这些字段建立索引--倒排索引,因为Elasticsearch最核心功能是搜索。
三、Elasticsearch是如何做到快速索引的
Elasticsearch使用的倒排索引比关系型数据库的B-Tree索引快,为什么呢?
什么是B-Tree索引?
上大学读书时老师教过我们,二叉树查找效率是logN,同时插入新的节点不必移动全部节点,所以用树型结构存储索引,能同时兼顾插入和查询的性能。因此在这个基础上,再结合磁盘的读取特性(顺序读/随机读),传统关系型数据库采用了B-Tree/B+Tree这样的数据结构:
为了提高查询的效率,减少磁盘寻道次数,将多个值作为一个数组通过连续区间存放,一次寻道读取多个数据,同时也降低树的高度。
什么是倒排索引?
继续上面的例子,假设有这么几条数据(为了简单,去掉about, interests这两个field):
| ID | Name | Age | Sex | | -- |:------------:| -----:| -----:| | 1 | Kate | 24 | Female | 2 | John | 24 | Male | 3 | Bill | 29 | Male
ID是Elasticsearch自建的文档id,那么Elasticsearch建立的索引如下:
Name:
| Term | Posting List | | -- |:----:| | Kate | 1 | | John | 2 | | Bill | 3 |
Age:
| Term | Posting List | | -- |:----:| | 24 | [1,2] | | 29 | 3 |
Sex:
| Term | Posting List | | -- |:----:| | Female | 1 | | Male | [2,3] |
Posting List
Elasticsearch分别为每个field都建立了一个倒排索引,Kate, John, 24, Female这些叫term,而[1,2]就是Posting List。Posting list就是一个int的数组,存储了所有符合某个term的文档id。
看到这里,不要认为就结束了,精彩的部分才刚开始...
通过posting list这种索引方式似乎可以很快进行查找,比如要找age=24的同学,爱回答问题的小明马上就举手回答:我知道,id是1,2的同学。但是,如果这里有上千万的记录呢?如果是想通过name来查找呢?
Term Dictionary
Elasticsearch为了能快速找到某个term,将所有的term排个序,二分法查找term,logN的查找效率,就像通过字典查找一样,这就是Term Dictionary。现在再看起来,似乎和传统数据库通过B-Tree的方式类似啊,为什么说比B-Tree的查询快呢?
Term Index
B-Tree通过减少磁盘寻道次数来提高查询性能,Elasticsearch也是采用同样的思路,直接通过内存查找term,不读磁盘,但是如果term太多,term dictionary也会很大,放内存不现实,于是有了Term Index,就像字典里的索引页一样,A开头的有哪些term,分别在哪页,可以理解term index是一颗树:
所以term index不需要存下所有的term,而仅仅是他们的一些前缀与Term Dictionary的block之间的映射关系,再结合FST(Finite State Transducers)的压缩技术,可以使term index缓存到内存中。从term index查到对应的term dictionary的block位置之后,再去磁盘上找term,大大减少了磁盘随机读的次数。
这时候爱提问的小明又举手了:"那个FST是神马东东啊?"
一看就知道小明是一个上大学读书的时候跟我一样不认真听课的孩子,数据结构老师一定讲过什么是FST。但没办法,我也忘了,这里再补下课:
FSTs are finite-state machines that map a term (byte sequence) to an arbitrary output.
假设我们现在要将mop, moth, pop, star, stop and top(term index里的term前缀)映射到序号:0,1,2,3,4,5(term dictionary的block位置)。最简单的做法就是定义个Map<string, integer="">,大家找到自己的位置对应入座就好了,但从内存占用少的角度想想,有没有更优的办法呢?答案就是:FST。
FSTs are finite-state machines that map a term (byte sequence) to an arbitrary output.
FST以字节的方式存储所有的term,这种压缩方式可以有效的缩减存储空间,使得term index足以放进内存,但这种方式也会导致查找时需要更多的CPU资源。
后面的更精彩,看累了的同学可以喝杯咖啡……
压缩技巧
Elasticsearch里除了上面说到用FST压缩term index外,对posting list也有压缩技巧。
小明喝完咖啡又举手了:"posting list不是已经只存储文档id了吗?还需要压缩?"嗯,我们再看回最开始的例子,如果Elasticsearch需要对同学的性别进行索引(这时传统关系型数据库已经哭晕在厕所……),会怎样?如果有上千万个同学,而世界上只有男/女这样两个性别,每个posting list都会有至少百万个文档id。 Elasticsearch是如何有效的对这些文档id压缩的呢?
Frame Of Reference
增量编码压缩,将大数变小数,按字节存储
首先,Elasticsearch要求posting list是有序的(为了提高搜索的性能,再任性的要求也得满足),这样做的一个好处是方便压缩,看下面这个图例:
如果数学不是体育老师教的话,还是比较容易看出来这种压缩技巧的。
原理就是通过增量,将原来的大数变成小数仅存储增量值,再精打细算按bit排好队,最后通过字节存储,而不是大大咧咧的尽管是2也是用int(4个字节)来存储。
Roaring bitmaps
说到Roaring bitmaps,就必须先从bitmap说起。Bitmap是一种数据结构,假设有某个posting list:
[1,3,4,7,10]
对应的bitmap就是:
[1,0,1,1,0,0,1,0,0,1]
非常直观,用0/1表示某个值是否存在,比如10这个值就对应第10位,对应的bit值是1,这样用一个字节就可以代表8个文档id,旧版本(5.0之前)的Lucene就是用这样的方式来压缩的,但这样的压缩方式仍然不够高效,如果有1亿个文档,那么需要12.5MB的存储空间,这仅仅是对应一个索引字段(我们往往会有很多个索引字段)。于是有人想出了Roaring bitmaps这样更高效的数据结构。
Bitmap的缺点是存储空间随着文档个数线性增长,Roaring bitmaps需要打破这个魔咒就一定要用到某些指数特性:
将posting list按照65535为界限分块,比如第一块所包含的文档id范围在0~65535之间,第二块的id范围是65536~131071,以此类推。再用<商,余数>的组合表示每一组id,这样每组里的id范围都在0~65535内了,剩下的就好办了,既然每组id不会变得无限大,那么我们就可以通过最有效的方式对这里的id存储。
联合索引
上面说了半天都是单field索引,如果多个field索引的联合查询,倒排索引如何满足快速查询的要求呢?
- 利用跳表(Skip list)的数据结构快速做“与”运算,或者
- 利用上面提到的bitset按位“与”
先看看跳表的数据结构:
将一个有序链表level0,挑出其中几个元素到level1及level2,每个level越往上,选出来的指针元素越少,查找时依次从高level往低查找,比如55,先找到level2的31,再找到level1的47,最后找到55,一共3次查找,查找效率和2叉树的效率相当,但也是用了一定的空间冗余来换取的。
假设有下面三个posting list需要联合索引:
如果使用跳表,对最短的posting list中的每个id,逐个在另外两个posting list中查找看是否存在,最后得到交集的结果。
如果使用bitset,就很直观了,直接按位与,得到的结果就是最后的交集。
四、总结和思考
Elasticsearch的索引思路:
将磁盘里的东西尽量搬进内存,减少磁盘随机读取次数(同时也利用磁盘顺序读特性),结合各种奇技淫巧的压缩算法,用及其苛刻的态度使用内存。
所以,对于使用Elasticsearch进行索引时需要注意:
- 不需要索引的字段,一定要明确定义出来,因为默认是自动建索引的
- 同样的道理,对于String类型的字段,不需要analysis的也需要明确定义出来,因为默认也是会analysis的
- 选择有规律的ID很重要,随机性太大的ID(比如java的UUID)不利于查询
关于最后一点,个人认为有多个因素:
其中一个(也许不是最重要的)因素: 上面看到的压缩算法,都是对Posting list里的大量ID进行压缩的,那如果ID是顺序的,或者是有公共前缀等具有一定规律性的ID,压缩比会比较高;
另外一个因素: 可能是最影响查询性能的,应该是最后通过Posting list里的ID到磁盘中查找Document信息的那步,因为Elasticsearch是分Segment存储的,根据ID这个大范围的Term定位到Segment的效率直接影响了最后查询的性能,如果ID是有规律的,可以快速跳过不包含该ID的Segment,从而减少不必要的磁盘读次数。
-
Elastic:菜鸟上手指南
2019-10-24 17:55:32您们好,我是Elastic的刘晓国。如果大家想开始学习Elastic的话,那么这里将是你理想的学习园地。在我的博客几乎涵盖了你想学习的许多方面。在这里,我来讲述一下作为一个菜鸟该如何阅读我的这些博客文章。 我们可以...你好,我是 Elastic 的刘晓国, Elastic 认证工程师,阿里云最有价值专家。如果大家想开始学习 Elastic 的话,那么这里将是你理想的学习园地。在我的博客几乎涵盖了你想学习的许多方面,从初级到高级的方方面面。你如果真的想学习 Elastic Stack 的话,那么你所需要的就是这一篇文章就够了。在这里,我来讲述一下作为一个菜鸟该如何阅读我的这些博客文章。如果你真心喜欢我的文章,请不惜点个赞!让我们一起更好地学习!如果你想按照视频学习,请观看我的文章 “Elastic:培训视频 ”,或者直接在 B 站观看。在这里的所列举的文字只是我写出来文章的一部分,但是足以让你对 Elastic Stack 有一个全面的了解。如果你想阅读所有关于 Elastic Stack 的文章,请参阅链接 Elastic。
除了我这里文章之外,Elastic 社区还定期开展一些 meetup 活动。敬请访问我们的网站 https://www.bagevent.com/org/738410
我们可以按照如下的步骤来学习:
1) Elasticsearch 简介:对 Elasticsearch 做了一个简单的介绍
2) Elasticsearch 中的一些重要概念: cluster, node, index, document, shards 及 replica:对 Elastic Stack 里的一些重要的概念做描述。理解这些概念对于我们学习和使用 Elastic Stack 是非常重要的
3) 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch:在我们常用的操作系统上进行安装 Elasticsearch
4) Kibana:如何在 Linux,MacOS 及 Windows上安装 Elastic 栈中的 Kibana:讲述如何在我们的操作系统上安装 Kibana
5) 开始使用 Elasticsearch (1): 了解如何创建 index,添加,删除,更新文档
6) 开始使用 Elasticsearch (2):了解如何进行搜索
7) 开始使用 Elasticsearch (3):了解如何进行分析数据: analyze 及 aggregate 数据
8) Elasticsearch 存储:
9) 基础知识:
10)Elastic:培训视频
11)Core Stack:
12) 中文分词器介绍:
- Elasticsearch: analyzer
- Elasticsearch:IK中文分词器
- Elasticsearch:ICU分词器介绍
- Elasticsearch:Smart Chinese Analysis plugin
- Elasticsearch:Pinyin 分词器
- Elasticsearch:hanlp 中文分词器
13) Aggregations
- Elasticsearch: 运用 shard_size 来提高 term aggregation 的精度
- Elasticsearch: 透彻理解 Elasticsearch 中的 Bucket aggregation
- Elasticsearch: Rare Terms Aggregation
- Elasticsearch: top_hits aggregation
- Elasticsearch: pipeline aggregation 介绍
- Elasticsearch: aggregation 介绍
- Elasticsearch: significant terms aggregation
- Elasticsearch:在 Elasticsearch 中的 Composite Aggregation
14) Painless 编程
- Elasticsearch:Painless script 编程
- Elasticsearch:Painless scripting
- Elasticsearch:Painless scripting 高级编程
- Kibana:使用 Script fields 来提高数据的可观测性
15)Ingest pipeline
16) 启动 Elastic 安全
- Elasticsearch:设置 Elastic 账户安全
- Elasticsearch:用户安全设置
- Kibana:为不同的用户生成不同的 Space
- Elasticsearch:运用 API 创建 roles 及 users
- Elastic:为 Elasticsearch 启动 https 访问
- Elastic:为 Elastic Docker 部署设置安全
- Elasticsearch:使用 IP 过滤器限制连接
- Elastic:使用 Postman 来访问 Elastic Stack
- Elasticsearch:创建 API key 接口访问 Elasticsearch
17) 解决方案 - Solutions
SIEM 及 Endpoint Security:
- Solutions:Elastic SIEM - 适用于家庭和企业的安全防护 ( 一)
- Solutions:Elastic SIEM - 适用于家庭和企业的安全防护 (二)
- Solutions:Elastic SIEM - 适用于家庭和企业的安全防护 (三)
- Solutions:Elastic SIEM - 适用于家庭和企业的安全防护 (四)
- Solutions:Elastic SIEM - 适用于家庭和企业的安全防护 ( 五)
APM:
- Elastic:应用程序性能监视/管理 (APM) 实践
- Observability:具有 Web 容器安装的 APM Java agent 动手实践 - Apache Tomcat
- Solutions:如何使用 Elastic APM 来测试多语言微服务应用程序
- Observability:从零基础到能够完成微服务可观测性的专家 - Service Map 实践
- Solutions:如何为 Python Flask 应用进行 APM
- Solutions:如何为 Python Django应用进行 APM
- Solutions:为 Nodejs 微服务提供APM功能
- Observability: 如何为 APM 定制 transactions 及 spans
- A nice article from an Elastic Colleague
Enterprise search:
- Solutions:Elastic workplace 搜索:随时随地搜索所有内容 (一)
- Solutions:Elastic workplace 搜索:随时随地搜索所有内容 (二)
- Enterprise:如何将自定义数据导入 Elastic Workplace Search - 一个简单的CSV示例
- Solutions:网站搜索 - Elastic Site Search
- Solutions:如何运用 Elastic App Search 快速建立出色的 React 搜索体验
- Solutions:Elastic App Search 入门
- Elastic App Search:免费的产品,可提供出色的搜索体验
- Enterprise:创建 meta 引擎来扩展你的 App search 体验
Observability:
- Elastic:使用 Heartbeat 进行 Uptime 监视
- Observability: 使用 Elasticsearch,Kibana,Heartbeat 监视网站并使用 Slack 发出警报
18) 通知及警报
- Elastic:使用 ElastAlert 发送通知
- Elastic:使用 ElastAlert 发送邮件通知
- X-Pack:创建阈值检查警报
- Elastic:创建你的第一个 Elastic watcher
- Elastic:创建你的第一个 Elastic watcher - 邮件通知
- Elastic:如何创建一个动态的阈值警报
- Elastic:创建你的第一个 Elastic alert - Webhook
- Elastic:创建一个 Elastic Log 及 Index alert - 7.7 发布版
- Elastic: 创建一个 Elastic 邮件警报 - 7.7 发行版
- Elastic:Elastic Maps 基于位置的警报 - 7.10
- Observability: 使用 Elasticsearch,Kibana,Heartbeat 监视网站并使用Slack发出警报
19) 跨集群操作
20) Maps
- Observability:如何在 Docker 之上使用 Elastic Stack 和 Kafka 可视化公共交通
- Beats:运用 Elastic Stack 分析 COVID-19 数据并进行可视化分析 - 续
- Beats:运用 Elastic Stack 分析 COVID-19 数据并进行可视化分析
- Kibana:在 Kibana 中定制 Regional Map
- Logstash:导入 zipcode CSV 文件和 Geo Search 体验
- Observability:使用 Elastic Stack 分析地理空间数据 (一)
- Observability:使用 Elastic Stack 分析地理空间数据 (二)
- Kibana:为 Elastic Maps 添加矢量地图层
21)机器学习
- Elastic:机器学习的原理及实践 - single metric job
- Elastic:机器学习的实践 - multi metric job
- Elastic:机器学习的实践 - population job
- Elastic:机器学习的实践 - categorization
- Elastic:机器学习 Demo
- Elastic:使用机器学习 API 创建一个任务
- Elastic:使用 Elastic 有监督的机器学习进行二进制分类
- Elasticsearch:在 Elasticsearch 中使用语言识别进行多语言搜索
- Elasticsearch:通过 inference pipeline 聚合为你的数据科学增加灵活性
22)丰富数据
- Elasticsearch: NLP (Natural Language Processing)在 Elasticsearch 中的应用
- Logstash:运用 memcache 过滤器进行大规模的数据丰富
- Logstash:Logstash translate 过滤器简介
- Logstash:运用 Elasticsearch 过滤器来丰富数据
- Observability:使用 Elastic Stack 分析地理空间数据 (一)
- Elasticsearch:运用 geoip 处理器来丰富数据
- Logstash:运用 jdbc_streaming 来丰富我们的数据
- Elasticsearch:如何使用 Elasticsearch ingest 节点来丰富日志和指标
- Elasticsearch:enrich processor (7.5发行版新功能)
- Elasticsearch:理解 Elasticsearch 中的 Percolator 数据类型及 Percolate 查询
24)各类语言日志导入
25)索引生命周期管理
26) Canvas
27) Elasticsearch SQL
28) Elastic certification:
- Elastic 认证种类:https://www.elastic.co/training/certification
- Elasric certification FAQ: https://www.elastic.co/training/certification/faq
- Certification registration: https://cloud.elastic.co/
- Elastic certification training:
- https://www.elastic.co/webinars/preparing-for-the-elastic-certified-engineer-exam
- https://www.elastic.co/webinars/how-to-prepare-for-the-elastic-certified-analyst-exam
- https://www.elastic.co/training/elastic-certified-analyst-exam
- https://www.elastic.co/training/data-analysis-with-kibana
- https://www.elastic.co/blog/elastic-certification-the-next-step-in-your-elasticsearch-training-journey
- Preparing for the Elastic Certified Engineer Exam - Get Elasticsearch Certified (1)
- Preparing for the Elastic Certified Engineer Exam - Get Elasticsearch Certified (2)
如果你想快速地部署自己的集群,请参阅如下的文档:
如果你想使用编程的方法把数据导入并搜索:
等我们完成了上面的阅读和练习后,我们会对 Elasticsearch 有一个基本的了解。我们可以再挑选相应的文章进行专门地阅读来了解更多关于 Elastic Stack方 面的知识。如果你想了解更多关于 Logstash 方面的知识,请参阅链接 Logstash。
如果你想了解更多关于 Kibana 方面的知识,请参阅链接 Kibana。
如果你想了解更多关于 Beats 方面的知识,请参阅链接 Beats。
如果你想了解更多关于 Elastic 解决方案的知识,请参阅链接 Solutions。
如果你想了解更多关于 X-Pack 方面的知识,请参阅链接 X-Pack。
如果你想了解更多关于 Kubernetes 方面的知识,请参阅链接 Kubernetes。
如果你想了解所有关于 Elastic 的内容,请参阅链接 Elastic。
如果大家对上面话题需要有更深一步的了解,请告诉我。我会尽力做出更好的文章供大家来参阅!
谢谢大家的关注!
关于 Elastic
Elastic 是一家专注搜索的企业。作为 Elastic Stack(Elasticsearch、Kibana、Beats 和 Logstash)的开发者,Elastic 构建了自管理型和 SaaS 型产品,这些产品能够使人们在应用搜索、站点搜索、企业搜索、日志、APM、指标、安全,商业分析等用例中大规模地实时使用数据。全球范围内有数以千计的公司/组织使用 Elastic 来为任务关键型系统提供支持,这些公司/组织包括思科、eBay、高盛、微软、Mayo 医学中心、美国国家航空航天局 (NASA)、纽约时报、维基百科和 Verizon。Elastic 是一家成立于 2012 年的分布式公司,Elasticians 在世界各国开展业务。Elastic 于2018年在中国也成立了独资公司 “弹性搜索(北京)信息技术有限公司”。 更多详情请参见 elastic.co/cn/。
有用链接:
- Elastic 官方网站:https://www.elastic.co/
- B 站培训视频 https://space.bilibili.com/630300453/video
- Elastic 中文社区 meetup 活动报名 https://www.bagevent.com/org/738410
- Elastic 开发文档:https://www.elastic.co/guide/index.html
- Elastic 官方会议网站: http://conf.elasticsearch.cn/
- Elasticsearch 中文网站:https://www.elasticsearch.cn/
- Elastic demos: https://demo.elastic.co/
- Elastic 文档:https://www.elastic.co/guide/index.html
- Elastic 社区:https://www.elastic.co/community/
- Elastic 中文社区:https://elasticsearch.cn/
- Elastic 视频:https://www.elastic.co/videos/, https://www.elastic.co/cn/videos/
- Elastic 中文博客:https://www.elastic.co/cn/blog/
- 腾讯社区:https://cloud.tencent.com/developer/column/4008
- Elasticsearch definitive guide: https://www.elastic.co/guide/en/elasticsearch/guide/index.html
- Elastic 书籍 (1):https://github.com/BlackThursdays/https-github.com-TechBookHunter-Free-Elasticsearch-Books/tree/master/book
- Elastic 书籍(2):https://github.com/BlackThursdays/https-github.com-TechBookHunter-Free-Elasticsearch-Books
- Elastic 认证指南:https://elasticsearch.cn/article/13530
- Elastic 认证: https://www.elastic.co/training/certification
- Elastic 培训:https://training.elastic.co/
- 掘金mirror网址:https://juejin.im/user/5df6e1bde51d4558381e82d6/posts
- Elastic的前世今生:https://mp.weixin.qq.com/s/FRFGwtDtFs_5RYn_vHjghw
- 从Splunk迁移到Elastic?https://www.elastic.co/splunk-alternative
- Elastic Workshop https://elk-workshop.github.io/
- Elastic Start:https://www.elastic.co/start
- tutorialspoint.com: https://www.tutorialspoint.com/elasticsearch/index.htm
- Elastic 同事博客:https://blog.csdn.net/u013613428?t=1
- Elastic Stack 在线:https://www.bookstack.cn/read/elasticsearch-7.9-en/f8c7123dddb484d0.md
- Elastic workshop 模块1 模块2 文档
-
ElasticSearch7.0.0安装sql
2020-04-08 11:23:58切换到elasticsearch的home目录执行: bin/elasticsearch-plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/7.0.0.0/elasticsearch-sql-7.0.0.0.zip 修改config/elasticsearch.... -
Elasticsearch系列——关闭Elasticsearch进程,并重新启动
2018-06-15 23:23:57有一种情况,当我们启动elasticsearch之后, 经过很长一段时间没有操作, 自己已经忘了是否已经启动了elasticsearch, 这时候我们可以通过下面的方式验证是否启动,并重新启动: step1 查找ES进程号 ps -ef | ... -
Elasticsearch学习,请先看这一篇!
2016-08-18 21:08:36题记:Elasticsearch研究有一段时间了,现特将Elasticsearch相关核心知识、原理从初学者认知、学习的角度,从以下9个方面进行详细梳理。欢迎讨论……0. 带着问题上路——ES是如何产生的?(1)思考:大规模数据如何... -
详述 Elasticsearch 通过范围条件查询索引数据的方法
2019-04-05 11:15:59在使用 Elasticsearch 的时候,我们可能会遇到需要**以范围为条件查询索引数据**的需求。有两种方法可以实现我们的需求: - 第一种:在服务器或者终端,使用命令来查询索引数据; - 第二种:编写程序,通过 Elastic... -
了解与使用ElasticSearch,这一篇就够了
2020-08-23 00:17:02文章目录ElasticSearch 初级学习简述第一章 Elasticsearch集群入门1.1 Elasticsearch基础篇1.1.1 数据架构的主要概念1.1.2 服务的主要概念1.2 安装Elasticsearch与kibana1.3 常用REST API,操作示例 ElasticSearch ... -
【ElasticSearch】elasticsearch analysis ansj分词器的安装及使用
2019-12-16 22:36:401. 修改pom文件配置 ...elasticsearch.version>1.7.1</elasticsearch.version> <dependency> <groupId>org.ansj</groupId> <artifactId>ansj_seg</artifactId> <c... -
ElasticSearch javaAPI demo示例
2017-09-28 08:57:05一.数据实体: ID:自增主键 ID:ID值 VALUE_DAY:该机器当天的值 GROUPNAME:组名 TYPE_MACHINE:机器类型 DATE:日期 TYPE:类型 二.Java代码: ...package elasticsearch.util;...import org.elastic -
如何安装Elastic SIEM和Elastic Endpoint Security
2020-12-05 21:00:48配置Elasticsearch SSL 配置Kibana SSL 配置Beats(Zeek)SSL 添加身份验证 向Elasticsearch添加数据 启用检测 安装Elastic EDR代理 安装证书 安装代理 结论 资源资源 最近几个月,Elastic Stack发生了很... -
ElasticSearch7.0.0安装IK分词器
2020-03-30 16:42:53为什么要在elasticsearch中要使用ik这样的中文分词呢,那是因为es提供的分词是英文分词,对于中文的分词就做的非常不好了,因此我们需要一个中文分词器来用于搜索和使用。就尝试安装下IK分词。 2.去github下载对应... -
使用Docker安装部署ElasticSearch和ElasticSearch-Head
2019-12-20 10:20:44什么是 Elasticsearch 想查数据就免不了搜索,搜索就离不开搜索引擎,百度、谷歌都是一个非常庞大复杂的搜索引擎,他们几乎索引了互联网上开放的所有网页和数据。然而对于我们自己的业务数据来说,肯定就没必要用... -
Elasticsearch实战
2020-12-02 09:06:50第一课时:Elasticsearch、Kibana安装 -
ElasticSearch7.6集群搭建
2020-03-30 16:30:42ElasticSearch7.6集群搭建 -
完整教程:spring-boot-starter-data-elasticsearch整合elasticsearch 6.x
2019-01-09 10:39:58新版本的SpringBoot 2的spring-boot-starter-data-elasticsearch中支持的Elasticsearch版本是2.X, 但Elasticsearch实际上已经发展到6.5.X版本了,为了更好的使用Elasticsearch的新特性, 所以弃用了spring-boot-... -
Elasticsearch:使用 Nginx 来保护 Elastic Stack
2021-01-05 10:50:06在我之前的文章 “反向代理及负载均衡在 Elasticsearch 中的应用” 中,我已经详述了如何使用 Nginx 来作为一个反向代理来访问 Elastic Stack。在今天的文章中,我将详述如何使用 Nginx 来保护 Elastic Stack。基于 ... -
【ElasticSearch】elasticsearch-jdbc插件的使用
2019-12-16 22:36:28elasticsearch-1.7.1 elasticsearch-jdbc-1.7.1 https://github.com/jprante/elasticsearch-jdbc 插件下载及安装 ... -
SpringBoot与ElasticSearch整合
2020-08-19 23:39:36SpringBoot与ElasticSearch整合 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:... -
Elasticsearch:使用 Elasticsearch 进行地理位置搜索
2020-10-29 16:11:19Elasticsearch 是一个功能强大的搜索引擎,支持地理查询,但并不是每个人都习惯于处理空间数据。 如果你对地理处理了解不多,或者想通过Elasticsearch了解地理处理,那么本文适合你。在我们的现实生活中,我们经常... -
Elasticsearch入门教程(一):Elasticsearch及插件安装
2018-01-29 13:50:35一:安装Elasticsearch 下载并解压Elasticsearch 直接到官网(https://www.elastic.co/cn/downloads/elasticsearch)下载适合自己的系统的Elasticsearch,这里下载的是目前最新的版本6.1.1,然后解压放到合适的目录... -
docker安装elasticsearch,处理elasticsearch所需内存不足问题
2020-10-06 16:40:38简述:在腾讯云的1核2G云服务器上安装docke,在docker上安装elasticsearch,出现启动elasticsearch立马秒关的问题 这时我看了下docker的日志 docker logs 676164fb24b3 # 查看某个容器的日志 经过相关资料证实,... -
ElasticSearch
2019-11-07 16:04:10ElasticSearch一、ElasticSearch安装二、ElasticSearch博文栏目 一、ElasticSearch安装 ElasticSearch安装: 原文作者:zhisheng:Elasticsearch 二、ElasticSearch博文栏目 以下ElasticSearch相关优秀博文来源于... -
Elasticsearch第一谈(安装Elasticsearch、安装可视化界面elasticsearch-head、安装kibana)
2020-08-27 20:20:09Elasticsearch简介 Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。 实时分析... -
Elasticsearch 简介
2019-08-08 16:04:31Elasticsearch是一个非常强大的搜索引擎。它目前被广泛地使用于各个IT公司。Elasticsearch是由Elastic公司创建并开源维护的。它的开源代码位于https://github.com/elastic/elasticsearch。同时,Elastic公司也拥有... -
elasticsearch安装
2018-08-11 10:39:301.windows下安装 elasticsearch (简称:ES) 版本elasticsearch-5.5.0 jdk 1.8 2.安装ES jdk安装跳过 解压elasticsearch到某个目录,例如F:\DevelopersTools\elasticsearch-5.5.0 进入bin 目录,双击执行 ... -
Elastic:在 ARM 上运行 Elasticsearch
2020-06-28 13:07:32Elastic 的指导原则之一就是要要和我们的用户在一起。我们以多种格式为多个平台发布了我们的产品,以便你可以尽快上线运行。 随着基于 ARM 的体系结构的日益普及,我们希望确保我们的用户可以在 ARM 以及 x86-64 上... -
Elasticsearch、Kibana安装
2020-12-01 16:28:50安装环境 系统:CentOS Linux release 7.8.2003 (Core) ...版本:elasticsearch-7.10.0-linux-aarch64.tar.gz 安装 step1 下载elasticsearch(https://www.elastic.co/cn/downloads/elasticsearch).
-
java反编译工具.rar
-
【数据分析-随到随学】数据可视化
-
verilog 16位有符号数乘法器
-
2021进大厂必备,阿里、腾讯、京东、滴滴等2020最新面试题汇总!.zip
-
【训练题30:二维区间DP+二维差分】Cake slicing | UVA1629 | HDU 2513
-
读取目录下文件列表的bat命令.rar
-
JavaEE框架(Maven+SSM)全程实战开发教程(源码+讲义)
-
61850客户端,用来测试61850服务端,很好用
-
BZOJ 4033. [HAOI2015]树上染色(树形DP,边贡献)
-
高精表ACD-2xx说明书(完整版).pdf
-
以iphone 6的视口为标准实现仿微信发现界面.zip
-
MFC开发简单聊天程序
-
第3章 入门程序、常量、变量
-
Data Guard主备GAP查询select * from V$ARCHIVE_GAP报错(ORA-01220)
-
C/C++编程全家桶(Daozy极限编程)
-
数据结构(C语言)-栈
-
Git Bash上传文件的命令
-
VisualSVN-VS2019-7.3.0.vsix
-
mxnet编译
-
QN8065 参考设计v1.0_20130708