自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(80)
  • 收藏
  • 关注

原创 ElasticSearch | 数据建模

数据建模逻辑模型 | 功能需求实体属性实体之间的关系搜索相关的配置物理模型 | 性能需求Setting: 分片数量Mapping:字段配置 / 关系处理如何对字段进行建模字段类型 | Text vs KeywordText用于全文本字段,文本会被 Analyzer 分词;默认不支持聚合分析及排序,需要设置 fielddata 为 true;Keyword用...

2020-05-28 23:37:57 123

原创 ElasticSearch | Painless Script

Painless Script | 简介自 ElasticSearch 5.0 引入,专门为 ElasticSearch 设计,扩展了 Java 的语法;6.0 开始,ElasticSearch 只支持 Painless,Groovy,JavaScript 和 Python 都不再支持;Painless 支持所有 Java 的数据类型和 Java API 子集;Painless Scr...

2020-05-28 21:15:11 171

原创 ElasticSearch | Ingest Pipeline

Ingest NodeElasticSearch 5.0 后,引入的一种新的节点类型,默认配置下,每个节点都是 Ingest Node;Ingest Node 具有预处理数据的能力,可拦截 Index 或 Bulk API 的请求,并对数据进行转换,然后重新返回给 Index 或 Bulk API,最后写入到 ElasticSearch 中;无需 Logstash,就可以进行数据的预处理,...

2020-05-28 20:44:04 176

原创 ElasticSearch | Update By Query | Reindex API

重建索引 | 使用场景索引的 Mapping 发生变更:字段类型更改,分词器及字典更新;索引的 Settings 发生变更:索引的主分片数发生改变;集群内或集群间需要做数据迁移ElasticSearch | 重建索引的 APIUpdate By Query:在现有索引上重建;Reindex:在其他索引上重建;Update By Query | 举几个栗子准备数据DELET...

2020-05-28 19:38:20 155

原创 ElasticSearch | 文档的父子关系

对象 | Nested 对象 | 局限性每篇博客的文档中,包含作者信息,当作者信息变更时,整个博客文档都需要变更;Parent & ChildElasticSearch 中提供了类似关系型数据库中 Join 的实现,使用 Join 数据类型实现,可以通过维护 Parent / Child 的关系,从而分离两个对象;父文档和子文档是两个独立的文档;更新父文档,无需重新索引子文...

2020-05-28 18:40:30 235

原创 ElasticSearch | 对象 | Nested 对象

在 ElasticSearch 中处理关联关系在关系型数据库中,一般会考虑范式化数据;而在 ElasticSearch 中,往往考虑反范式化数据;反范式化的好处:读数据的速度快;无需表连接;无需行锁;ElasticSearch 并不擅长处理关联关系,一般采用以下四种方法处理关联关系:对象类型嵌套对象父子关联关系应用端关联案例 | 搜索包含对象数组的文档数据准...

2020-05-28 17:51:06 112

原创 ElasticSearch | 聚合分析的原理 & 精准度的问题

分布式系统的近似统计算法分布式系统的近似统计算法.pngmin 聚合分析的执行流程这个分析的结果是准确的;min 聚合分析的执行流程.pngTerms Aggregation | 返回参数中的 2 个特殊值doc_count_error_upper_bound:被遗漏的分桶中可能包含的文档数的最大数;sum_other_doc_count:除了返回...

2020-05-28 14:52:26 1169

原创 ElasticSearch | 聚合的作用范围 | 聚合中的排序

聚合的作用范围ElasticSearch 聚合分析的默认作用范围是 Query 的查询结果集;同时 ElasticSearch 还支持以下方式改变聚合的作用范围:FilterPost FilterGlobal聚合的作用范围 | 举几个栗子query 的作用范围年龄大于 40 岁员工的分桶;POST employees/_search{ "size": 0, ...

2020-05-28 13:23:29 188

原创 ElasticSearch | Pipeline 聚合分析

Pipeline支持对聚合分析的结果,再次进行聚合分析;Pipeline 的分析结果会输出到原结果中,根据位置的不同,分为两类:Sibling - 结果和现有分析结果同级max / min / avg & sum bucketstats / extended status bucketpercentiles bucketParent - 结果内嵌到现有的聚合分析结果...

2020-05-28 03:18:28 204

原创 ElasticSearch | Buckets & Metric | 嵌套聚合

Metric Aggregation单值分析min / max / avg / sumcardinality(类似 distinct count)多值分析 | 输出多个分析结果stats / extended statspercentile / percentile ranktop hits(排在前面的示例)Metric Aggregation | 举几个栗子创建索引 |...

2020-05-28 02:36:32 183

原创 ElasticSearch | 处理并发读写操作

并发控制的必要性并发案例.png两个 Web 程序同时更新某个文档,如果缺乏有效的并发,会导致更改的数据丢失;悲观并发控制假定有同时写共享变量的可能,会对资源加锁,例如数据库行锁;乐观并发控制假定冲突是不会发生的,不会阻止正在尝试的操作;如果数据在读写中被更改,读写将失败;应用程序决定如何解决冲突,例如重试机制,使用新的数据,或者将错误报告给用户;ES 采用...

2020-05-27 22:33:58 844

原创 ElasticSearch | 分页 & 遍历 | From | Size | Search After | Scroll

分布式系统中深度分页的问题深度分页.pngElasticSearch 天生就是分布式的,数据保存在多个分片和多台机器上的;当发起一个查询,指定其 From=990,Size=10 的时候,会在每个分片上都先获取 1000 个文档;然后通过 Coordinating Node 聚合所有的结果;最后再通过排序选取前 1000 个文档;页数越深,占用内存越多,为了避免深度分页带来的...

2020-05-27 21:41:56 270

原创 ElasticSearch | 排序 | Doc Values | Fielddata

排序默认情况下,ElasticSearch 会根据算分进行排序;可以使用 sort API 指定排序的规则排序 | sort API | 举几个栗子根据单字段排序使用了 sort API 之后,_score 的值就会变成 null;POST /kibana_sample_data_ecommerce/_search{ "size": 5, "query": { ...

2020-05-27 20:12:14 354

原创 ElasticSearch | 分布式搜索 | 内部机制

ElasticSearch 搜索 | 两阶段QueryFetchQuery 阶段Query 阶段.png用户发送搜索请求到 ES 节点,节点收到请求后,会以 Coordinating 节点的身份,在 6 个主副分片中随机选择 3 个分片,发送查询请求;被选中的分片执行查询,进行排序;然后每个分片都会返回 From + Size 个排序后的文档 Id 和排序值给 Coo...

2020-05-27 18:44:30 105

原创 ElasticSearch | Lucene Index | Refresh | Transaction Log | Flash | Merge

关于 ElasticSearch 的一些问题为什么 ElasticSearch 的搜索是近实时的(1s 后被搜索到)?ElasticSearch 如何保证在断电时数据也不会丢失?为什么删除文档并不会立即释放空间?倒排索引的不可变性倒排索引采用了 Immutable Design,一旦生成,不可更改;不可变性带来的好处无需考虑并发写文件的问题,避免了锁机制带来的性能问题;一...

2020-05-27 16:50:43 190

原创 ElasticSearch | 文档分布式存储

文档存储在分片上 | 分片均匀的分布在节点上文档会存储在具体的某个主分片和副本分片上,例如:文档 1 会存储在 P0 和 R0 分片上;文档到分片的映射算法确保文档能均匀分布在所有分片上,充分利用硬件资源,避免部分机器空闲,部分机器繁忙;潜在的算法随机 / Random Robin,当查询文档 1 时,分片数很多,需要多次查询才能查到文档 1;维护文档到分片的映射关系,当文档数...

2020-05-27 13:26:36 88

原创 ElasticSearch | Primary Shard | Replica Shard | 故障转移

Primary Shard | 主分片主分片主要是提升系统的存储容量;通过主分片,可以将一份索引的数据,分散在多个 Data Node 上,实现存储的水平扩展;主分片数在创建索引的时候指定,后续默认不能更改,如要修改,需重建索引;Replica Shard | 副本分片提升可用性一旦主分片丢失,副本分片可以 Promote 成主分片;副本分片数可以动态调整;提升系统的读取性...

2020-05-27 11:36:58 475

原创 ElasticSearch | 集群分布式模型 | 选主 | 脑裂

分布式特性ElasticSearch 的分布式架构带来的好处存储的水平扩展,支持 PB 级的数据;提高系统的可用性,部分节点停止服务,整个集群的服务不受影响;ElasticSearch 的分布式架构不同的集群通过不同的名字来区分,默认名字是 elasticsearch;通过配置文件修改,或者命令行中 -E cluster.name=geektime 进行设定;Master E...

2020-05-27 09:58:14 172

原创 ElasticSearch | 跨集群搜索

水平扩展的痛点单集群水平扩展时,节点数不能无线增加;当集群的 meta 信息(节点,索引,集群状态)过多,会导致更新压力变大,单个 Active Master 会成为性能瓶颈,导致整个集群无法正常工作;早期版本,通过 Tribe Node 可以实现多集群访问的需求,但是还是存在一定的问题:Tribe Node 会以 Client Node 的方式加入集群,集群中 Master Nod...

2020-05-26 13:07:21 135

原创 ElasticSearch | Completion Suggester | Context Suggester

The Completion SuggesterCompletion Suggester 提供了“自动完成(Auto Completion)”的功能,用户每输入一个字符,就需要即时发送一个查询请求到后端查找匹配项;这种功能对性能的要求比较苛刻,ElasticSearch 采用了不同的数据结构,而不是使用了倒排索引来实现;通过将 Analyze 的数据编码成 FST 和索引一起存放;FST 会...

2020-05-26 12:05:04 504

原创 ElasticSearch | Term & Phrase Suggester

什么是搜索建议现代的搜索引擎,一般都会提供 Suggest as you type 的功能;帮助用户在输入搜索的过程中,进行自动补全或纠错;通过协助用户输入更加精准的关键词,提高后续搜索阶段文档匹配的程度;在 Google 上搜索,一开始会自动补全,当输入到一定长度,如因为单词拼写错误无法补全,就会开始提示相似的词或者句子;ElasticSearch Suggester API搜索...

2020-05-26 01:01:12 250

原创 ElasticSearch | 综合排序 | Function Score Query | 优化算分

算分 & 排序ElasticSearch 默认会以文档的相关度算分进行排序;可以通过指定一个或多个字段进行排序;使用相关度算分(_score)排序,不能满足某些特定条件;某些场景下,无法结合相关度,对排序实现更多的控制;Function Score Query可以在查询结束后,对每一个匹配的文档进行一系列的重新算分,根据新生成的分数排序;Function Score ...

2020-05-25 16:35:54 610

原创 ElasticSearch | Search Template | Index Alias

Search Template解耦程序和 DSL;使得开发工程师、搜索工程师和性能工程师各司其职;Search Template | 举几个栗子Search Template | 创建 | 删除 | 查询POST _scripts/tmdb{ "script": { "lang": "mustache", "source": { "_source":...

2020-05-25 15:46:49 166

原创 ElasticSearch | 多语言 | 中文分词器 | 检索

自然语言 & 查询 Recall当处理人类自然语言时,有些情况下,尽管搜索和原文不完全匹配,但是希望搜到一些内容;一些可采取的优化归一化词元:清除变音符号;抽取词根:清除单复数和时态的差异;包含同义词;拼写错误或同音异形词;多语言混合的挑战一些具体的多语言场景不同的索引使用不同的语言;同一个索引中,不同的字段使用不同的语言;一个文档的一个字段内混合不同的语言...

2020-05-25 14:49:27 522

原创 ElasticSearch | 单字符串 | 多字段 | multi_match

multi_match | 三种场景最佳字段 | Best Field当字段之间相互竞争,又相互关联,例如 title 和 body 这样的字段;评分来自最匹配字段;多数字段 | most_fields处理英文内容时,一种常见的手段是,在主字段上采用英文分词器(English Analyzer)抽取词干,加入同义词,以匹配更多的文档;相同的文本,加入子字段中,采用标准分词器(St...

2020-05-25 13:56:50 376

原创 ElasticSearch | 单字符串 | 多字段 | Disjunction Max Query

bool 查询 | should 子句 | 举例分析数据准备 | blogsPUT /blogs/_doc/1{ "title": "Quick brown rabbits", "body": "Brown rabbits are commonly seen."}PUT /blogs/_doc/2{ "title": "Keeping pets healt...

2020-05-25 12:24:33 156

原创 ElasticSearch | bool 查询 | Query Content vs Filter Context

bool 查询 | 复合查询一个 bool 查询,是一个或多个查询子句的组合;bool 查询总共包含 4 种子句,其中 2 种会影响算分,2 种不影响算分;Query Context | 影响算分mustshouldFilter Context | 不影响算分must_notfilter - 必须匹配相关性算分不只是全文本检索的专利,也适用于 Yes | No 的子句...

2020-05-25 11:20:32 139

原创 ElasticSearch | 相关性算分

相关性算分 | Relevance搜索的相关性算分,描述了一个文档和查询语句的匹配程度,ES 会对每一个匹配查询条件的文档进行算分 _score;相关性算分是一篇文档针对某个关键词来说的相关度高低的一个分数;打分的本质算排序,需要把最符合用户需求的文档排在前面,ES 5 之前,默认的相关性算分采用 TF-IDF,现在采用 BM 25;词频 | TF | Term FrequencyT...

2020-05-23 16:15:16 237

原创 ElasticSearch | 结构化搜索

结构化搜索 | Structured Search结构化搜索是指对结构化数据的搜索;日期、布尔类型和数字都是结构化的;文本也可以是结构化的:彩色笔可以有离散的颜色集合:红、绿、蓝一个博客可能被标记了标签,例如:分布式、搜索电商网站上的商品都有 UPCs 或其他的唯一标识,它们都需要遵从严格规定的,结构化的格式;ElasticSearch 中的结构化搜索布尔、日期、时间和...

2020-05-23 13:02:09 104 1

原创 ElasticSearch | Term 查询 | 全文查询

Term | 词项Term 是表达语义的最小单位,在搜索和自然语言处理时都需要处理 Term;ES 中 Term 级别的查询:Term Query / Range Query / Exists Query / Prefix Query / Wildcard Query;在 ES 的 Term 查询中,对输入不做分词,会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公式为...

2020-05-21 22:30:46 218

原创 ElasticSearch | Aggregation | 聚合

Aggregation | 聚合ElasticSearch 除搜索以外,提供的针对 ES 数据进行统计分析的功能;实时性高;Hadoop 是 T + 1 的;通过聚合,会得到数据的概览,是分析和总结全套数据,而不是寻找单个文档;尖沙咀和香港岛的房客数量;不同的价格区间,可预定的经济型酒店和五星级酒店的数量;高性能,只需要一条语句,就可以从 ElasticSearch 中...

2020-05-21 16:57:14 89

原创 ElasticSearch | Index Template | Dynamic Template

Index Template按照一定的规则设置 Mappings 和 Settings,自动匹配到新创建的索引之上;模板只在一个索引被创建的时候才会产生作用,修改模板不会影响已创建的索引;可以设定多个索引模板,这些设定会被 merge 在一起;可以指定 order 的数值,控制 merge 的过程;Index Template | 工作方式当一个索引创建时:应用 Elast...

2020-05-21 14:52:45 95

原创 ElasticSearch | 内置分词器 | 自定义分词器

自定义分词器当 ElasticSearch 自带的分词器无法满足需要时,可以自定义分词器,通过组合不同的组件实现;分词器的三个组件:Character Filters:针对原始文本处理,例如去除 html 标签;Tokenizer:按照规则分为单词;Token Filters:将切分的单词进行加工,小写,删除 stopwords,增加同义词;Character Filt...

2020-05-20 13:15:08 239

原创 ElasticSearch | 多字段特性

多字段特性在为一个索引配置 Mapping 的时候,可以为一个字段增加一个子字段;默认情况下,text 类型的字段,ElasticSearch 都会为其加上一个 keyword 子字段,子字段的类型是 keyword,加了 keyword 子字段的字段值,可以实现精确匹配;可以为字段加个子字段,从而以英文的方式进行分词,进而实现用拼音就可以搜索汉字;多字段特性 | 举个栗子comp...

2020-05-20 13:14:55 333

原创 ElasticSearch | 显示 Mapping 设置 | 常见参数

自定义 Mapping 的建议创建一个临时的索引,写入一些样本数据;通过 API 查看该索引的 Dynamic Mapping;在次基础上修改 Mapping;使用修改好的 Mapping 创建新的索引;删除临时索引;控制字段是否被索引创建索引 users字段 mobile 将无法被索引,意味着:mobile 字段无法被搜索,而且节省了很多磁盘开销;DELETE user...

2020-05-20 02:54:42 189

原创 ElasticSearch | Dynamic Mapping | 常见字段类型

MappingMapping 类似于 MySQL 中 Schema 的定义,作用如下:定义索引中字段的名称;定义索引中字段的类型;设置字段 -> 倒排索引的相关配置;Mapping 会把 JSON 文档映射成 Lucene 所需要的扁平格式;字段的数据类型简单类型Text / KeywordDateInteger / FloatingBooleanIPv4...

2020-05-20 01:36:54 181

原创 ElasticSearch | API | Request Body | QueryString | SimpleQueryString

QueryString在 URI Search 中是有查询参数的;在 Request Body 的查询方式中,也有相应的方式提供查询的参数,这就是 QueryString 和 SimpleQueryString;QueryString | 举几个栗子"description" : "+name:ruan +name:yiming"POST users/_search{ "q...

2020-05-20 00:52:46 287

原创 ElasticSearch | API | Request Body | Query DSL

ignore_unavailable=true可以忽略因尝试访问不存在的索引 "404_idx" 导致的报错POST /movies,404_idx/_search?ignore_unavailable=true{ "profile": true, "query": { "match_all": {} }}分页查询POST /kibana_sa...

2020-05-19 23:18:55 94

原创 ElasticSearch | API | URI Search

DisjunctionMaxQuery | 泛查询所有字段中包含 2012 的文档GET /movies/_search?q=2012{ "profile":"true"}TermQuery | 指定字段查询title 中包含 2012 的GET /movies/_search?q=2012&df=title{ "profile":"true"}或...

2020-05-19 23:18:42 87

原创 ElasticSearch | API | Search

URI Search用 HTTP GET 的方式,在 URI 中使用查询参数;URI Search | 举个栗子curl -XGET "http://elasticsearch:9200/kibana_sample_data_ecommerce/_search?q=customer_first_name:Eddie" 或在 Kibana 中的 Devtools 中执行 GET kibana_...

2020-05-19 18:22:48 108

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除