Elasticsearch原理解析及应用
文章平均质量分 78
从基本原理解析至基于Kibana的http请求对于API的使用和基于JAVA API的调用
迷途码界
一些原理解读,经验分享
segmentfault:迷途码界(https://segmentfault.com/u/cclovel/articles)
展开
-
Elasticsearch 性能优化常见配置
Elasticsearch 性能优化常见配置分片异步同步数据索引存储类型注:基于elasticsearch.yml或api请求的方式进行配置。分片异步同步数据不同分片之间的数据同步是一个很大的花费,默认是1s同步,如果我们不要求实时性,我们可以执行如下:$ curl -XPUT http://localhost:9200/my_index -d '{ "settings" : { "index" : { "refresh_interval":"60s"原创 2020-09-17 14:43:03 · 227 阅读 · 0 评论 -
Elasticsearch Java API 的使用(23)—实现集群管理
集群管理 使用ClusterHealthResponce实现集群信息监测和管理public class EsCommonTerms throws UnknownHostException{ public void queryString(TransportClient client){ ClusterHealthResponce healths = client.adm...原创 2018-09-06 20:22:03 · 907 阅读 · 0 评论 -
Elasticsearch Java API 的使用(22)—实现桶聚合
分组聚合 使用terms时间分组集合public class EsTermsAgg throws UnknownHostException{ public void TermsAgg(TransportClient client){ AggregationBuilder agg = AggregationBuilders.terms("terms").field("ag...原创 2018-09-06 19:58:22 · 2387 阅读 · 0 评论 -
Elasticsearch Java API 的使用(21)—实现组合查询
组合查询 使用boolQuery实现组合查询public class EsCommonTerms throws UnknownHostException{ public void queryString(TransportClient client){ //bool实现组合查询,must表示必须满足,mustNot表示必须不满足,should表示可以满足,filter表...原创 2018-09-06 18:44:15 · 2403 阅读 · 0 评论 -
Elasticsearch Java API 的使用(20)—实现query_string
常用词查询 常用词查询使用commonTermsQuerypublic class EsQueryString throws UnknownHostException{ public void queryString(TransportClient client){ //commonTermsQuery查询 Querybuilder build = Que...原创 2018-09-06 18:01:25 · 3630 阅读 · 0 评论 -
Elasticsearch Java API 的使用(19)—实现常用聚合查询(max聚合、min聚合、avg聚合、sum聚合、cardinality聚合)
max聚合查询 最大值聚合查询使用public class EsAgg throws UnknownHostException{ public void maxAgg(TransportClient client){ //最大值聚合查询(max) AggregationBuilder agg = AggregationBuilders.max("aggM...原创 2018-09-06 16:03:44 · 2588 阅读 · 6 评论 -
Elasticsearch Java API 的使用(18)—实现range(范围)、prefix(前缀)、wildcard(通配符)、fuzzy(模糊)、type(_type)、ids(_id)查询
range查询 范围查询使用rangeQuerypublic class EsMatchAll{ public void updateIndex(TransportClient client){ //范围查询(range) QueryBuilder qb = QueryBuilders.rangeQuery("birthdaty") ...原创 2018-09-06 14:56:14 · 3873 阅读 · 0 评论 -
Elasticsearch Java API 的使用(17)—实现term查询、terms查询
term查询 trem查询只可指定查询一个字段对应单个词条public class EsMatchAll{ public void updateIndex(TransportClient client){ //查询所有(match_all) QueryBuilder qb = QueryBuilders.termQuery("interests", "c原创 2018-09-06 14:36:32 · 7803 阅读 · 0 评论 -
Elasticsearch Java API 的使用(16)—实现match_all查询、match查询 和 multimath查询
match_all 查询所有public class EsMatchAll{ public void updateIndex(TransportClient client){ //查询所有(match_all) QueryBuilder qb = QueryBuilders.matchAllQuery(); SearchResponse s...原创 2018-09-06 12:06:13 · 11448 阅读 · 0 评论 -
Elasticsearch Java API 的使用(15)—实现批量操作(mget&bulk)
Java实现批量操作(mget&bulk)mget批量获取使用MultiGetResponsepublic class EsMget{ public void updateIndex(TransportClient client){ MultiGetResponse response = client.prepareMultiGet() ...原创 2018-09-06 11:08:17 · 2557 阅读 · 0 评论 -
Elasticsearch Java API 的使用(14)—优化索引创建之setting设置、写入优化
创建索引优化一、索引刷新间隔调整:refresh_interval默认情况下索引的refresh_interval为1秒,这意味着数据写1秒后就可以被搜索到,每次索引的 refresh 会产生一个新的 lucene 段,这会导致频繁的 segment merge 行为,如果你不需要这么高的搜索实时性,应该降低索引refresh 周期(即你可能想优化索引速度而不是近实时搜索, 可以通过设...原创 2018-08-06 11:52:58 · 9554 阅读 · 0 评论 -
Elasticsearch Java API 的使用(13)—分组聚合之一
分组聚和不像度量聚合那样通过字段进行计算,而是根据文档创建分组。每个聚合都关联一个标准(取决于聚合的类型),决定了一个文档在当前的条件下是否会“划入”分组中。 换句话说,分组实际上定义了一个文档集。除了这些分组之外,分组聚和也会计算和返回“划入”每个分组中文档的数量。 与度量聚合不同,分组聚合可以拥有子聚合。这些子聚合可以聚合由它们的“父”聚合创建分组。 分组集合有不同的类型,对应着不同的“分原创 2017-11-22 17:32:14 · 6119 阅读 · 3 评论 -
Elasticsearch Java API 的使用(12)—度量聚合之一
度量聚合从文档中提取出来的值并进行计算。这些值通常从文档中的字段(使用数据字段)中提取出来,单也可以使用脚本进行计算。 数字型度量聚合是一种特殊类型的度量聚合,输出数字型的值。聚合输出一个数字指标(例如平均值聚合)称之为单值数字型度量聚合,产生多个指标值(例如统计聚合)称之为多值数字型度量聚合。当这些聚合直接作为一些分组聚合的子聚合时,单值和多值数字型度量聚合的内容就会发挥巨大的作用。例如分组聚合原创 2017-11-22 14:38:16 · 3059 阅读 · 0 评论 -
Elasticsearch Java API 的使用(11)—优化索引创建之mapping设置
优化索引创建all字段是把所有其它字段中的值,以空格为分隔符组成一个大字符串,然后被分析和索引,但是不存储,也就是说它能被查询,但不能被取回显示。_all能让你在不知道要查找的内容是属于哪个具体字段的情况下进行搜索,例如:PUT my_index/user/1 { "first_name": "John", "last_name": "Smith&原创 2017-09-05 08:43:48 · 5121 阅读 · 0 评论 -
Elasticsearch Java API 的使用(10)—在Spring框架中建立持久化连接
1、问题后台跟Elasticsearch打交道需要建立起起客户端的连接,才能对Elasticsearch进行读写操作,频繁的建立连接、断开,将降低Elasticsearch的工作效率;建立持久化将减少后台与Elasticsearch建立客户端连接的时间,大大提高工作效率。 通过spring的配置文件将Elasticsearch以注入的方式建立持久化的连接将可以解决这个问题。2、解决:A、配置Spri原创 2017-09-04 16:22:54 · 1216 阅读 · 0 评论 -
Elasticsearch Java API 的使用(9)— Bluk的批量原理 & Bulk大数据量的批量上传示例
Elasticsearch对多个文档进行索引的简便方法。Bulk api的支持可以实现一次请求执行批量的添加、删除、更新等操作。Bulk操作使用的是UDP协议,UDP无法确保与ElasticSearch服务器通信时不丢失数据。 将数据累计到一定数量进行批量上传,大大加快数据上传速度。public class Bulk implements WriteRequest{ public stat原创 2017-09-05 08:41:57 · 2994 阅读 · 0 评论 -
Elasticsearch Java API 的使用(8)—Scroll (游标)API详解
滚动查询Elasticsearch中进行大数据量查询时,往往因为设备、网络传输问题影响查询数据的效率;Elasticsearch中提供了Scroll(游标)的方式对数据进行少量多批次的滚动查询,来提高查询效率。public class Scroll { public static void main(String[] args) { try{ long s原创 2017-09-05 08:40:31 · 12615 阅读 · 0 评论 -
Elasticsearch Java API 的使用(7)—多条件查询
多条件设置//多条件设置MatchPhraseQueryBuilder mpq1 = QueryBuilders .matchPhraseQuery("pointid","W3.UNIT1.10LBG01CP301");MatchPhraseQueryBuilder mpq2 = QueryBuilders .matchPhrase原创 2017-09-05 08:38:56 · 23652 阅读 · 1 评论 -
Elasticsearch Java API 的使用(6)—时间聚合
java时间聚合public class EsAggregation{ public void searchAggregation(TransportClient client){ AggregationBuilder aggregation = AggregationBuilders .dateRange("agg") .fi原创 2017-09-05 08:37:13 · 4779 阅读 · 0 评论 -
Elasticsearch Java API 的使用(5)— 范围查询(时间范围查询示例)
java时间范围查询public class EsRange{ public void RangeSearch(TransportClient client){ //时间范围的设定 RangeQueryBuilder rangequerybuilder = QueryBuilders .rangeQuery("input原创 2017-09-05 08:35:45 · 49668 阅读 · 11 评论 -
Elasticsearch Java API 的使用(4)—更新索引(update & upset)与 Bulk的批量更新
Java更新索引public class EsUpdate{ public void updateIndex(TransportClient client){ Date time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") .parse("2016-7-21 00:原创 2017-09-05 08:33:19 · 8516 阅读 · 0 评论 -
Elasticsearch Java API 的使用(3)—添加索引 & 删除索引 & 根据条件删除索引数据
Java添加索引public class EsAddIndex{ public void addIndex(TransportClient client){ Date time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") .parse("201原创 2017-09-04 16:29:58 · 4919 阅读 · 0 评论 -
Elasticsearch Java API 的使用(2)—创建索引
Java创建索引创建索引前需要建立elasticsearch客户端,可查看Elasticsearch Java API 的使用(1)—创建客户端public class EsIndex{ public void CreateIndex(TransportClient client){ CreateIndexRequestBuilder cib=client.admin()原创 2017-09-04 16:28:48 · 6881 阅读 · 0 评论 -
Elasticsearch Java API 的使用(1)—创建客户端
Java建立客户端调用API方法前提,通过putty串行接口连接软件(选择SSH)开启安装在Linux环境下的elasticsearch5.1.2的服务。需要注意的几点: 1、cluster.name是安装elasticsearch时设置的名称 2、调用服务时xxx.xxx.xxx.xxx写的是虚拟机的ip 3、端口填写elasticsearch默认的9300端口public class原创 2017-09-04 16:27:18 · 1756 阅读 · 3 评论 -
Elasticsearch 基于不可修改field的重建索引
重建索引一个 field 的设置是不能修改的,如果要修改一个 field,那么应该重新按照新的mapping,建立一个index,然后将数据批量查询出来,重新用 bulk api 写入到新的index中。批量查询的时候,建议采用scroll api,并且采用多线程并发的方式来reindex数据,每次scroll就查询指定日期扽一段数据,交给一个线程即可。//创建一个索引并写入一条数据,...原创 2018-09-05 21:52:05 · 1060 阅读 · 0 评论 -
Elasticsearch dynamic mapping(动态映射) 策略
当 Elasticsearch 遇到文档中以前 未遇到的字段,它用 dynamic mapping(动态映射) 来确定字段的数据类型并自动把新的字段添加到类型映射。有时这是想要的行为有时又不希望这样。通常没有人知道以后会有什么新字段加到文档,但是又希望这些字段被自动的索引。也许你只想忽略它们。如果Elasticsearch是作为重要的数据存储,可能就会期望遇到新字段就会抛出异常,这样能及时发现...原创 2018-09-05 17:40:27 · 5863 阅读 · 2 评论 -
Elasticsearch 使用scroll滚动技术实现大数据量搜索、深度分页问题 和 search_after 实现深度分页
如果一次性要查出来比如10万条数据,那么性能会很差,此时一般会采取用scroll滚动查询,一批一批的查,直到所有数据都查询完为止。scroll搜索会在第一次搜索的时候,保存一个当时的视图快照,之后只会基于该旧的视图快照提供数据搜索,如果这个期间数据变更,是不会让用户看到的采用基于_doc(不使用_score)进行排序的方式,性能较高每次发送scroll请求,我们还需要指定一个scroll...原创 2018-09-05 16:38:35 · 7135 阅读 · 1 评论 -
Elasticsearch Doc_Values解析
DocValue其实是Lucene在构建倒排索引时,会额外建立一个有序的正排索引(基于document => field value的映射列表)。{“birthday”:“1985-11-11”,age:23}{“birthday”:“1989-11-11”,age:29}document age birthdaydoc1 23 1985-11-11doc1 29 198...原创 2018-09-04 22:29:56 · 8695 阅读 · 0 评论 -
Elasticsearch 如何计算相关度分数
相关度分数的计算使用的是TF/IDF算法(Term Frequency&Inverse Document Frequency)。Term Frequency:我们查询的文本中的词条在document中出现了多少次,出现次数越多,相关度越高。搜索内容:hello world Hello, I love china. Hello world,how are you!Inve...原创 2018-09-04 22:11:27 · 2708 阅读 · 0 评论 -
Elasticsearch 字符串排序问题
对一个字符串类型的字段进行排序通常不准确,因为已经被分词成多个词条了 解决方式:对字段索引两次,一次索引分词(用于搜索),一次索引不分词(用于排序)//不同查询GET /lib3/_search//默认的text是进行了分词,进行排序将报错GET /lib3/user/_search{ "query": { "match_all": {} },...原创 2018-09-04 21:41:13 · 6347 阅读 · 1 评论 -
Elasticsearch query_string查询及copy_to解析
Elastic search的常规查询如下所示GET /lib3/user/_search?q=interests:changgeGET /lib3/user/_search?q=+interest:changgeGET /lib3/user/_search?q=-interests:changge//查询含有changge或则含有hejiu的文档,但是没有指定具体的字段//此时...原创 2018-09-04 21:11:27 · 2326 阅读 · 0 评论 -
Elasticsearch 分页查询中的deep paging问题
分页查询的deep paging问题首先回顾下分页查询GET /lib3/user/_search{ "from": 0, "size": 2, "query": { "terms": { "interests": ["hejiu", "changge"] }原创 2018-09-03 21:23:24 · 1162 阅读 · 2 评论 -
Elasticsearch 对文档操作时的分片交互过程分析
路由文档到分片当我们要在ES中存储数据的时候,数据应该存储在主分片和复制分片中的哪一个中去;当我们在ES中检索数据的时候,又是怎么判断要查询的数据是属于哪一个分片。进程不能是随机的,因为我们将来要检索文档。事实上,它根据一个简单的算法决定:shard = hash(routing) % number_of_primary_shardsRouting值是一个任意字符串,它默认是 _i...原创 2018-08-24 14:16:39 · 1138 阅读 · 0 评论 -
Elasticsearch 文档的核心元数据和文档修改、删除原理解析
文档核心元数据_index:说明了一个文档存储在哪个索引中,同一个索引下存放的是相似的文档(文档的field多数是相同的,可以由不同的field,但不建议使用),索引名必须是小写的,不能以下划线开头,不能包含括号。_type:表示文档属于索引中的哪个类型,一个索引下只能有一个type(6.0版本之前可以有多个type),类型名可以是大写也可以是小写的,不能以下划线开头,不能包含括号。_i...原创 2018-08-23 17:11:57 · 1259 阅读 · 0 评论 -
Elasticsearch 水平扩容过程与容错机制
水平扩容过程扩容后 primary shard 和 replica shard 会自动的负载均衡。扩容后每一个节点上的 shard 会减少,那么分配给每个 shard 的CPU、内存、IO资源会更多,性能将会提高。 扩容的极限,如果有6个 shard,扩容的极限就是6个节点,每个节点上一个 shard,如果想超出扩容的极限,比如说扩容到9个节点,那么可以增加 replica shard...原创 2018-08-23 14:54:13 · 5514 阅读 · 7 评论 -
Elasticsearch 分片和副本机制与单点、多点环境创建index解析
分片和副本机制index 包含多个 shard,创建 index 时可以在settings中设置分片数,不设置时默认是5个。每个 shard 都是一个最小工作单元,承载部分数据;每个 shard 都是一个 lucene 实例,并且具有完整的建立索引和处理能力。增减节点时,shard 会自动在 nodes 中负载均衡。primary shard(主分片) 和 replica shard(...原创 2018-08-23 10:37:46 · 4934 阅读 · 0 评论 -
Elasticsearch 分布式架构解析
Elasticseasrch的架构遵循其基本概念:一个采用Restful API标准的 高扩展性 和 高可用性 的 实时数据分析 的全文搜索工具。高扩展性:体现在Elasticsearch添加节点非常简单,新节点无需做复杂的配置,只要配置好集群信息将会被集群自动发现。高可用性:因为Elasticsearch是分布式的,每个节点都会有备份,所以down一两个节点也不会出现问题,集群会通过备份...原创 2018-08-22 23:17:07 · 2759 阅读 · 5 评论 -
Elasticsearch 聚合查询、桶聚合、管道聚合及复合查询
集合查询sum聚合sum是一个求累加值的聚合,其作用与关系型数据库中相同。GET /lib4/items/_search{ "size": 0, //表示查询多少条文档,聚合只需就和结果,输出文档可以设置为0条 "aggs": { "price_of_sum": { //自行取名作为结果集原创 2018-08-21 14:24:51 · 13795 阅读 · 2 评论 -
Elasticsearch 结构化搜索_filter执行原理深度剖析(bitset机制与caching机制)与过滤查询
Filter查询filter是不计算相关性的,同时可以cache。因此,filter速度要比query快。//创建索引并写入数据POST /lib4/items/_bluk{"index": {"_id": 1}}{"pric原创 2018-08-21 11:47:46 · 683 阅读 · 0 评论 -
Elasticsearch 基本查询(Query查询)
基本查询(Query查询)数据准备及简单查询//首先做一个数据准备,创建一个索引PUT /lib3{ "settings": { "number_of_shards": 3, "number_of_replicas": 0 }, "mappings": {原创 2018-08-18 18:23:35 · 13104 阅读 · 1 评论