ES作为一个NoSQL,典型的应用场景就是存储数据。即用户可以通过api添加数据到es中。由于Lucene内部的实现,每次添加的数据并不是实时落盘的。而是在内存中维护着索引信息,直到缓冲区满了或者显式的commit,数据才会落盘,形成一个segement,保存在文件中。那么假如由于某种原因,ES的进程突然挂了,那些在内存中的数据就会丢失。而实际上,用户调用api,返回结果确认用户数据已经添加到索引
使用healthapi可以查看es集群的健康度。healthapi的用法如下:curl'http://localhost:9200/_cluster/health'healthapi的返回值中有一个核心的字段status,status有3种取值:green,yellow,red。分别代表集群的3种状态:主分片和副本都已经分配,主分片已经分配副本分片没有,制定分片没有分配。也就是说,healthap
ES的deleteapi使用非常简单。curl-XDELETE'http://localhost:9200/index/type/doc_id'前面学习了getapi的主要流程,这里探索一下deleteapi的实现原理。优先选择deleteapi而非indexapi,主要是觉得删除貌似更容易,选择deleteapi学习曲线应该比较平缓。ES相关功能Action的命名很统一,比如getapi,对应实
前面研究过ES的getapi的整体思路,作为编写ES插件时的借鉴。当时的重点在与理解整体流程,主要是shardOperation()的方法内部的调用逻辑,就弱化了shards()方法。实际上shards()方法在理解ES的结构层面,作用更大一些。我们还是从getapi入手来理解shards()。先回顾一下getapi的使用流程:添加文档到ES:curl-XPUT'http://localhost:
ES作为一个分布式系统,需要多个节点协同,来管理集群,处理用户请求。那么很自然有个问题,ES的集群是如何组建起来的?所谓集群,就是多台计算机一起协同工作。既然是协同工作,那么就必须步调一致,步调一致才能得解放。需要有领导这个角色来协调资源,这个角色在ES中命名为Master。Master这个角色,不是ES的独有的,基本上所有的分布式系统都有这个角色的存在,比如Zookeeper,Mongo等。Ma
Luene的核心应用场景是全文检索。简单来说,就是通过用户输入的关键词来匹配相关文档,然后根据匹配程度返回TopN的查询结果给用户。这里需要解决的一个核心问题就是如何快速返回TopN的结果,这本质上是一个排序的问题。说起排序,我们有很多选择,冒泡,快排,归并...。这些排序算法在数据量小的时候,不是问题。一旦数据量过大,就成为问题了。例如对1000万的数组排序:Integer[]a=newInte
集成测试在es源码中的用法比较简单。我选择的切入口是delete-by-query插件。将es插件的源码导入intellij后,直接运行类DeleteByQueryRestIT,就会运行所有的集成测试用例。-ea-Dtests.security.manager=false这个运行结果,会让我产生两个疑问:这个类里面没有test注解的方法,其入口在哪里?resource/rest-api-spec目
我们需要查看数据的统计量时,均值是最重要的特征之一。对于海量数据,这类简单的聚合ES可以做到秒级别返回。聚合是ES的特色功能。那么ES是如何实现这一功能的呢?我们知道,ES的数据存储在各个节点中,所以ES的实现AvgAggregation时基本思路就是先统计各个节点,然后汇总。先了解ES是如何统计单个节点:参考AvgAggregator@OverridepublicLeafBucketCollec
ES的聚合是其一大特色。然而出于性能的考虑,ES的聚合是以分片Shard为单位,而非Index为单位,所以有些聚合的准确性是需要注意的。比如:TermAggregations.es的基数聚合使用到了hyperloglog算法。出于好奇,了解了一下。在海量数据场景下,我们通常会遇到这样的两个问题:数据排重。比如在推送消息场景,消息重复对用户是打扰,用户发券场景,重复发券就是损失了。pv/uv统计。这
ES的官方文档中关于检索和排序的关系说得特别好:Searchneedstoanswerthequestion"Whichdocumentscontainthisterm?",whilesortingandaggregationsneedtoansweradifferentquestion:"Whatisthevalueofthisfieldforthisdocument?".搜索要解决的问题是:&
各个业务数据“汇总到hive,经过ETL处理后,导出到数据库“是大数据产品的典型业务流程。这其中,sqoop(离线)和kafka(实时)几乎是数据总线的标配了。但是有些业务也有不标准的,比如hive数据导入到ES.hive数据导入到ES,官方组件是elasticsearch-hadoop.其用法在前面的博客中已有介绍。那么其实现原理是怎样的呢?或者说,es-hadoop这家伙到底是怎么把hive表
github上es项目讲述其易用性时,用来举例的就有getapi。curl-XPUT'http://localhost:9200/twitter/doc/1?pretty'-H'Content-Type:application/json'-d'{"user":"kimchy","post_date":"2009-11-15×××3:12:00","message":"TryingoutElastic
ES中,有一类参数是可以动态调整的,比如副本数量:number_of_replicas。在插件开发中,如何添加自己的自定义参数呢?在插件的入口,添加onModule(ClusterModulemodule)即可。publicclassShgyPluginextendsPlugin{@OverridepublicStringname(){return"shgy-plugin";}@Overridep
开发中需要用到ES的插件,开发ES插件需要了解ES的内部结构,于是再次开始学习ES的源码。一方面了解插件开发的套路,一方面了解get接口的实现细节。了解ES的原理,源码是文档最好的补充。源码甚至比文档更有助于了解ES的内部核心。首先从git上clone下源码:gitclonehttps://github.com/elastic/elasticsearch.gitcdelasticsearchgit
大数据方兴未艾,Hive在业界,是大数据的标配了。因此hive数据添加到ES的应用场景还是比较常见的。学习ES官方的es-hadoop,有从hive导数据到ES.实验可行。hive的版本:hive-1.1.0-cdh5.9.0具体的步骤如下:step1将elasticsearch-hadoop-hive-version.jar添加到hivewgethttps://artifacts.elastic
es提供template功能的出发点在哪里呢?作为NoSQL数据库,ES在数据入库前是不做schema设定的,也就是不限定数据字段.这对日志类型的数据来说,是个利好的场景.但是这种不设定schema的做法,有时有太过自由.有些业务场景,我们需要预先设定field的分词方式.这时固然可以使用mappings解决.但是业务接入前要通知一下,先建个索引,想想有点不智能.有没有更灵活一点的做法呢?temp
理解NumericRangeQuery, 首先需要理解Lucene是如何存储数值类型. 文本初步探讨了Int和Float两种数值类型在Lucene中的存储实现,数值类型的分词原理, 最后给出NumericRangeQuery的简单理解.Lucene最初设计是实现全文检索功能, 即只处理字符串. 因此, 在处理数值时, Lucene也是将数值编码为字符串。将数值转换成字符串, Lucen
Apache LuceneTM5.0.0 版本即将发布 源文地址:http://blog.mikemccandless.com/2014/11/apache-lucene-500-is-coming.html最后,在密集发布一系列4.x版本的特性后,最近发布的是4.10.2版本,我们把工作重心转移到了Apache Lucene的另一个版本!目前没有给出
3.4 Lucene工具箱之OpenBitSet 在Lucene中,DocId具有这样的特征:唯一/递增。而且在搜索的过程,不同term之间的DocId集合进行逻辑运算的需求非常之多。OpenBitSet正是集合运算的利器。3.4.1 &
在使用Lucene时,有一条建议”不要频繁去打开关闭硬盘索引”。为什么会有这条建议?这就需要在IndexReader的实例化过程中找答案。先说一个结论“IndexReader的实例化过程是一个非常耗时的过程”。由于IndexReader只是一个抽象类,在调用代码:真正得到的是StandardDirec
前言通常在搜索打分完毕后,IndexSearcher会返回一个docID序列,但是仅仅有docID我们是无法看到存储在索引中的document,这时候就需要通过docID来得到完整Document信息,这个过程就需要对fdx/fdt文件进行读操作。为了更清楚地了解fdx/fdt文件的作用,本文把fdx/fdt文件的读和写整合到了一起,尽管这在Lucene中是两个分开的过程。1. 索引生成阶段索引生
LZ4算法又称为Realtime Compression Algorithm,在操作系统(linux/freeBSD)、文件系统(OpenZFS)、大数据(Hadoop)、搜索引擎(Lucene/solr)、数据库(Hbase)……都可以看到它的身影,可以说是一个非常通用的算法。LZ4最突出的地方在于它的压缩/解压速度。基础知识理解Lucene中LZ4算法的实现,需要有以下两点基础知识:1、&nb
Java提供了四种类型来存储一个整型:Byte,short,int,long。但是如果整数的范围在[0,100000],那么只需要17bits就足够存储了,因为2^17=131072。但是,你不能够选择short来存储,因为short存储[65536,100000]之间的数会溢出。如果你用int来存储,那么每个数至少要浪费15bits的空间,大约47%的内存空
Lucene的索引过程分两个阶段,第一阶段把文档索引到内存中;第二阶段,即内存满了,就把内存中的数据刷新到硬盘上。 倒排索引信息在内存存储方式 Lucene有各种Field,比如StringField,Tex
Lucene将索引文档的过程设计成两个阶段,写入内存阶段和写入硬盘阶段。在写入内存阶段,Lucene通过IndexChain把document分解并把相关信息存储到内存中,等到满足flush条件(内存容量或者文档个数积累到临界值),就通过IndexChain把内存中的数据写入硬盘。IndexChain
无论是垂直搜索,还是通用搜索引擎,对外提供搜索服务其压力都比较大,经常有垂直电商在做活动的时候服务器宕机。对面访问压力比较大的情况,一般的应对方法就是【集群】+【负载均衡】。Solr提供了两种解决方案来对应访问压力。其一是Replication,其一是SolrCloud。Replication采用了master/slave 模式
缓存对于提高搜索引擎的吞吐量,降低CPU占用率极为重要。Lucene/Solr在这块做了很多的工作。Lucene/Solr中默认提供了5种缓存,同时solr还提供扩展缓存接口,允许开发者自定义缓存。1 缓存的基本原理Solr实现了两种策略的缓存:LRU(Leatest Recently Used)和LFU(Least&n
package fst; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; import java.u
fieldValueCache默认是存在的。如果没有在solrConfig.xml中配置,那么其初始大小10,最大10000,不会autowarm 。在PC上开发时,会有内存溢出的风险。
前面简单了解了ZooKeeper的相关知识,为SolrCloud的学习作了一层铺垫。在SolrCloud的wiki中,可以很简单地用jetty实现嵌入式ZooKeeper的单机版SolrCloud。但是在生产环境中,Solr一般都是部署在Tomcat上的。为了使架构更加灵活,ZooKeeper也是单独部署的。日常学习中,就一台单机怎么学习solrCloud呢?本文将记录在win7上实现ZooKee
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号