
Elasticsearch
文章平均质量分 68
追逐方向的风
克己养晦
展开
-
分片内部原理
在 集群内的原理, 我们介绍了 分片, 并将它 描述成最小的 工作单元_。但是究竟什么 _是 一个分片,它是如何工作的? 在这个章节,我们回答以下问题:为什么搜索是 近 实时的?为什么文档的 CRUD (创建-读取-更新-删除) 操作是 实时 的?Elasticsearch 是怎样保证更新被持久化在断电时也不丢失数据?为什么删除文档不会立刻释放空间?refresh, flush, 和 optimi...翻译 2018-03-22 11:06:18 · 576 阅读 · 0 评论 -
精确值 VS 全文
精确值 如它们听起来那样精确。例如日期或者用户 ID,但字符串也可以表示精确值,例如用户名或邮箱地址。对于精确值来讲,Foo 和 foo 是不同的,2014 和 2014-09-15 也是不同的。另一方面,全文 是指文本数据(通常以人类容易识别的语言书写),例如一个推文的内容或一封邮件的内容。全文通常是指非结构化的数据,但这里有一个误解:自然语言是高度结构化的。问题在于自然语言的规则是复杂的,导致...翻译 2018-02-23 15:09:39 · 343 阅读 · 0 评论 -
倒排索引
Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。例如,假设我们有两个文档,每个文档的 content 域包含如下内容:The quick brown fox jumped over the lazy dogQuick brown foxes leap over lazy dogs...翻译 2018-02-23 17:11:05 · 247 阅读 · 0 评论 -
分析与分析器
分析 包含下面的过程:首先,将一块文本分成适合于倒排索引的独立的 词条 ,之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall分析器执行上面的工作。 分析器 实际上是将三个功能封装到了一个包里:字符过滤器首先,字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成 `and`。分词器其次,字符串被 ...翻译 2018-02-23 17:15:18 · 264 阅读 · 0 评论 -
内置分析器
Elasticsearch附带了可以直接使用的预包装的分析器。 接下来我们会列出最重要的分析器。为了证明它们的差异,我们看看每个分析器会从下面的字符串得到哪些词条:"Set the shape to semi-transparent by calling set_trans(5)"标准分析器标准分析器是Elasticsearch默认使用的分析器。它是分析各种语言文本最常用的选择。它根据 Unico...翻译 2018-02-23 17:18:32 · 264 阅读 · 0 评论 -
什么时候使用分析器
当我们 索引 一个文档,它的全文域被分析成词条以用来创建倒排索引。 但是,当我们在全文域 搜索 的时候,我们需要将查询字符串通过 相同的分析过程 ,以保证我们搜索的词条格式与索引中的词条格式一致。全文查询,理解每个域是如何定义的,因此它们可以做 正确的事:当你查询一个 全文 域时, 会对查询字符串应用相同的分析器,以产生正确的搜索词条列表。当你查询一个 精确值 域时,不会分析查询字符串, 而是搜索...翻译 2018-02-23 17:27:47 · 216 阅读 · 0 评论 -
映射
为了能够将时间域视为时间,数字域视为数字,字符串域视为全文或精确值字符串, Elasticsearch 需要知道每个域中数据的类型。这个信息包含在映射中。如 数据输入和输出 中解释的, 索引中每个文档都有 类型 。每种类型都有它自己的 映射 ,或者 模式定义。映射定义了类型中的域,每个域的数据类型,以及Elasticsearch如何处理这些域。映射也用于配置与类型有关的元数据。我们会在 类型和映射...翻译 2018-02-23 17:35:47 · 300 阅读 · 0 评论 -
自定义域映射
尽管在很多情况下基本域数据类型 已经够用,但你经常需要为单独域自定义映射 ,特别是字符串域。自定义映射允许你执行下面的操作:全文字符串域和精确值字符串域的区别使用特定语言分析器优化域以适应部分匹配指定自定义数据格式还有更多域最重要的属性是 type 。对于不是 string 的域,你一般只需要设置 type :{ "number_of_clicks": { "type": ...翻译 2018-02-23 17:45:38 · 878 阅读 · 0 评论 -
使文本可被搜索
必须解决的第一个挑战是如何 使文本可被搜索。 传统的数据库每个字段存储单个值,但这对全文检索并不够。文本字段中的每个单词需要被搜索,对数据库意味着需要单个字段有索引多值(这里指单词)的能力。最好的支持 一个字段多个值 需求的数据结构是我们在 倒排索引 章节中介绍过的 倒排索引 。 倒排索引包含一个有序列表,列表包含所有文档出现过的不重复个体,或称为 词项 ,对于每一个词项,包含了它所有曾出现过文档...翻译 2018-03-22 14:13:14 · 306 阅读 · 0 评论 -
映射和分析
当摆弄索引里面的数据时,我们发现一些奇怪的事情。一些事情看起来被打乱了:在我们的索引中有12条推文,其中只有一条包含日期 2014-09-15 ,但是看一看下面查询命中的 总数 (total):GET /_search?q=2014 # 12 resultsGET /_search?q=2014-09-15 # 12 results !GET /_sea...翻译 2018-02-23 14:30:02 · 325 阅读 · 0 评论 -
执行分布式检索
在继续之前,我们将绕道讨论一下在分布式环境中搜索是怎么执行的。 这比我们在 分布式文档存储 章节讨论的基本的 增-删-改-查 (CRUD)请求要复杂一些。一个 CRUD 操作只对单个文档进行处理,文档的唯一性由 _index, _type, 和 routing values (通常默认是该文档的 _id )的组合来确定。 这表示我们确切的知道集群中哪个分片含有此文档。搜索需要一种更加复杂的执行模型...翻译 2018-02-28 17:11:12 · 343 阅读 · 0 评论 -
请求体查询-查询与过滤
Elasticsearch 使用的查询语言(DSL) 拥有一套查询组件,这些组件可以以无限组合的方式进行搭配。这套组件可以在以下两种情况下使用:过滤情况(filtering context)和查询情况(query context)。当使用于 过滤情况 时,查询被设置成一个“不评分”或者“过滤”查询。即,这个查询只是简单的问一个问题:“这篇文档是否匹配?”。回答也是非常的简单,yes 或者 no ,...翻译 2018-02-28 11:07:41 · 418 阅读 · 0 评论 -
请求体查询-最重要的查询
虽然 Elasticsearch 自带了很多的查询,但经常用到的也就那么几个。我们将在 深入搜索 章节详细讨论那些查询的细节,接下来我们对最重要的几个查询进行简单介绍。match_all查询match_all 查询简单的 匹配所有文档。在没有指定查询方式时,它是默认的查询:{ "match_all": {}}它经常与 filter 结合使用--例如,检索收件箱里的所有邮件。所有邮件被认为具有相同的...翻译 2018-02-28 11:25:37 · 318 阅读 · 0 评论 -
请求体查询-组合多查询
组合多查询现实的查询需求从来都没有那么简单;它们需要在多个字段上查询多种多样的文本,并且根据一系列的标准来过滤。为了构建类似的高级查询,你需要一种能够将多查询组合成单一查询的查询方法。你可以用 bool 查询来实现你的需求。这种查询将多查询组合在一起,成为用户自己想要的布尔查询。它接收以下参数:must文档 必须 匹配这些条件才能被包含进来。must_not文档 必须不 匹配这些条件才能被包含进来...翻译 2018-02-28 12:07:44 · 249 阅读 · 0 评论 -
请求体查询-验证查询
查询可以变得非常的复杂,尤其 和不同的分析器与不同的字段映射结合时,理解起来就有点困难了。不过 validate-query API 可以用来验证查询是否合法。GET /gb/tweet/_validate/query{ "query": { "tweet" : { "match" : "really powerful" } }}以上 va...翻译 2018-02-28 13:44:13 · 253 阅读 · 0 评论 -
排序
为了按照相关性来排序,需要将相关性表示为一个数值。在 Elasticsearch 中, 相关性得分 由一个浮点数进行表示,并在搜索结果中通过 _score 参数返回, 默认排序是 _score 降序。有时,相关性评分对你来说并没有意义。例如,下面的查询返回所有 user_id 字段包含 1 的结果:GET /_search{ "query" : { "bool" : {...翻译 2018-02-28 14:40:46 · 219 阅读 · 0 评论 -
字符串排序与多字段
被解析的字符串字段也是多值字段, 但是很少会按照你想要的方式进行排序。如果你想分析一个字符串,如 fine old art , 这包含 3 项。我们很可能想要按第一项的字母排序,然后按第二项的字母排序,诸如此类,但是 Elasticsearch 在排序过程中没有这样的信息。你可以使用 min 和 max 排序模式(默认是 min ),但是这会导致排序以 art 或是 old ,任何一个都不是所希望...翻译 2018-02-28 15:55:28 · 222 阅读 · 0 评论 -
什么是相关性
我们曾经讲过,默认情况下,返回结果是按相关性倒序排列的。 但是什么是相关性? 相关性如何计算?每个文档都有相关性评分,用一个正浮点数字段 _score 来表示 。 _score 的评分越高,相关性越高。查询语句会为每个文档生成一个 _score 字段。评分的计算方式取决于查询类型 不同的查询语句用于不同的目的: fuzzy 查询会计算与关键词的拼写相似程度,terms 查询会计算 找到的内容与关键...翻译 2018-02-28 16:50:15 · 10164 阅读 · 0 评论 -
Doc Values介绍
本章的最后一个话题是关于 Elasticsearch 内部的一些运行情况。在这里我们先不介绍新的知识点,所以我们应该意识到,Doc Values 是我们需要反复提到的一个重要话题。当你对一个字段进行排序时,Elasticsearch 需要访问每个匹配到的文档得到相关的值。倒排索引的检索性能是非常快的,但是在字段值排序时却不是理想的结构。在搜索的时候,我们能通过搜索关键词快速得到结果集。当排序的时候...翻译 2018-02-28 16:54:48 · 402 阅读 · 0 评论 -
动态更新索引
下一个需要被解决的问题是怎样在保留不变性的前提下实现倒排索引的更新? 答案是: 用更多的索引。通过增加新的补充索引来反映新近的修改,而不是直接重写整个倒排索引。每一个倒排索引都会被轮流查询到--从最早的开始--查询完后再对结果进行合并。Elasticsearch 基于 Lucene, 这个 java 库引入了 按段搜索 的概念。 每一 段 本身都是一个倒排索引, 但 索引 在 Lucene 中除表...翻译 2018-03-22 14:48:14 · 1646 阅读 · 0 评论 -
近实时搜索
随着按段(per-segment)搜索的发展, 一个新的文档从索引到可被搜索的延迟显著降低了。新文档在几分钟之内即可被检索,但这样还是不够快。磁盘在这里成为了瓶颈。 提交(Commiting)一个新的段到磁盘需要一个 fsync 来确保段被物理性地写入磁盘,这样在断电的时候就不会丢失数据。 但是 fsync 操作代价很大; 如果每次索引一个文档都去执行一次的话会造成很大的性能问题。我们需要的是一个...翻译 2018-03-22 15:07:18 · 409 阅读 · 0 评论 -
自定义分析器
虽然Elasticsearch带有一些现成的分析器,然而在分析器上Elasticsearch真正的强大之处在于,你可以通过在一个适合你的特定数据的设置之中组合字符过滤器、分词器、词汇单元过滤器来创建自定义的分析器。在 分析与分析器 我们说过,一个 分析器 就是在一个包里面组合了三种函数的一个包装器, 三种函数按照顺序被执行:字符过滤器字符过滤器 用来 整理 一个尚未被分词的字符串。例如,如果我们的...翻译 2018-03-20 17:27:58 · 364 阅读 · 0 评论 -
类型和映射
类型 在 Elasticsearch 中表示一类相似的文档。 类型由 名称 —比如 user 或 blogpost —和 映射 组成。映射, 就像数据库中的 schema ,描述了文档可能具有的字段或 属性 、 每个字段的数据类型—比如 string, integer 或 date —以及Lucene是如何索引和存储这些字段的。类型可以很好的抽象划分相似但不相同的数据。但由于 Lucene 的处理...翻译 2018-03-21 15:34:13 · 708 阅读 · 0 评论 -
根对象
根对象映射的最高一层被称为 根对象 ,它可能包含下面几项:一个 properties 节点,列出了文档中可能包含的每个字段的映射各种元数据字段,它们都以一个下划线开头,例如 _type 、 _id 和 _source设置项,控制如何动态处理新的字段,例如 analyzer 、 dynamic_date_formats 和dynamic_templates其他设置,可以同时应用在根对象和其他 obj...翻译 2018-03-21 17:37:41 · 1084 阅读 · 0 评论 -
动态映射
当 Elasticsearch 遇到文档中以前 未遇到的字段,它用 dynamic mapping 来确定字段的数据类型并自动把新的字段添加到类型映射。有时这是想要的行为有时又不希望这样。通常没有人知道以后会有什么新字段加到文档,但是又希望这些字段被自动的索引。也许你只想忽略它们。如果Elasticsearch是作为重要的数据存储,可能就会期望遇到新字段就会抛出异常,这样能及时发现问题。幸运的是可...翻译 2018-03-21 17:46:58 · 365 阅读 · 0 评论 -
自定义动态映射
如果你想在运行时增加新的字段,你可能会启用动态映射。 然而,有时候,动态映射 规则 可能不太智能。幸运的是,我们可以通过设置去自定义这些规则,以便更好的适用于你的数据。日期检测当 Elasticsearch 遇到一个新的字符串字段时,它会检测这个字段是否包含一个可识别的日期,比如 2014-01-01 。 如果它像日期,这个字段就会被作为 date 类型添加。否则,它会被作为 string 类型添...翻译 2018-03-22 09:20:47 · 610 阅读 · 0 评论 -
缺省映射
通常,一个索引中的所有类型共享相同的字段和设置。 _default_ 映射更加方便地指定通用设置,而不是每次创建新类型时都要重复设置。 _default_ 映射是新类型的模板。在设置 _default_ 映射之后创建的所有类型都将应用这些缺省的设置,除非类型在自己的映射中明确覆盖这些设置。例如,我们可以使用 _default_ 映射为所有的类型禁用 _all 字段, 而只在 blog 类型启用:P...翻译 2018-03-22 10:44:52 · 333 阅读 · 0 评论 -
重新索引你的数据
尽管可以增加新的类型到索引中,或者增加新的字段到类型中,但是不能添加新的分析器或者对现有的字段做改动。 如果你那么做的话,结果就是那些已经被索引的数据就不正确, 搜索也不能正常工作。对现有数据的这类改变最简单的办法就是重新索引:用新的设置创建新的索引并把文档从旧的索引复制到新的索引。字段 _source 的一个优点是在Elasticsearch中已经有整个文档。你不必从源数据中重建索引,而且那样通...翻译 2018-03-22 10:55:11 · 597 阅读 · 0 评论 -
索引别名和零停机
在前面提到的,重建索引的问题是必须更新应用中的索引名称。 索引别名就是用来解决这个问题的!索引 别名 就像一个快捷方式或软连接,可以指向一个或多个索引,也可以给任何一个需要索引名的API来使用。别名 带给我们极大的灵活性,允许我们做下面这些:在运行的集群中可以无缝的从一个索引切换到另一个索引给多个索引分组 (例如, last_three_months)给索引的一个子集创建 视图在后面我们会讨论更多...翻译 2018-03-22 11:02:40 · 353 阅读 · 0 评论 -
配置分析器
第三个重要的索引设置是 analysis 部分, 用来配置已存在的分析器或针对你的索引创建新的自定义分析器。在 分析与分析器 ,我们介绍了一些内置的 分析器,用于将全文字符串转换为适合搜索的倒排索引。standard 分析器是用于全文字段的默认分析器, 对于大部分西方语系来说是一个不错的选择。 它包括了以下几点:standard 分词器,通过单词边界分割输入的文本。standard 语汇单元过滤器...翻译 2018-03-20 16:53:12 · 279 阅读 · 0 评论 -
索引设置
你可以通过修改配置来自定义索引行为,详细配置参照 索引模块Elasticsearch 提供了优化好的默认配置。 除非你理解这些配置的作用并且知道为什么要去修改,否则不要随意修改。下面是两个 最重要的设置:number_of_shards每个索引的主分片数,默认值是 5 。这个配置在索引创建后不能修改。number_of_replicas每个主分片的副本数,默认值是 1 。对于活动的索引库,这个配置...翻译 2018-03-20 16:41:00 · 692 阅读 · 0 评论 -
持久化变更
如果没有用 fsync 把数据从文件系统缓存刷(flush)到硬盘,我们不能保证数据在断电甚至是程序正常退出之后依然存在。为了保证 Elasticsearch 的可靠性,需要确保数据变化被持久化到磁盘。在 动态更新索引,我们说一次完整的提交会将段刷到磁盘,并写入一个包含所有段列表的提交点。Elasticsearch 在启动或重新打开一个索引的过程中使用这个提交点来判断哪些段隶属于当前分片。即使通过...翻译 2018-03-22 15:40:39 · 300 阅读 · 0 评论 -
段合并
由于自动刷新流程每秒会创建一个新的段 ,这样会导致短时间内的段数量暴增。而段数目太多会带来较大的麻烦。 每一个段都会消耗文件句柄、内存和cpu运行周期。更重要的是,每个搜索请求都必须轮流检查每个段;所以段越多,搜索也就越慢。Elasticsearch通过在后台进行段合并来解决这个问题。小的段被合并到大的段,然后这些大的段再被合并到更大的段。段合并的时候会将那些旧的已删除文档 从文件系统中清除。 被...翻译 2018-03-22 15:57:13 · 432 阅读 · 0 评论 -
查询阶段
在初始 查询阶段 时, 查询会广播到索引中每一个分片拷贝(主分片或者副本分片)。 每个分片在本地执行搜索并构建一个匹配文档的 _优先队列_。优先队列一个 优先队列 仅仅是一个存有 top-n 匹配文档的有序列表。优先队列的大小取决于分页参数 from 和 size 。例如,如下搜索请求将需要足够大的优先队列来放入100条文档。GET /_search{ "from": 90, "...翻译 2018-03-20 15:07:04 · 356 阅读 · 0 评论 -
取回阶段
查询阶段标识哪些文档满足 搜索请求,但是我们仍然需要取回这些文档。这是取回阶段的任务分布式阶段由以下步骤构成:协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 GET 请求。每个分片加载并 丰富 文档,如果有需要的话,接着返回文档给协调节点。一旦所有的文档都被取回了,协调节点返回结果给客户端。协调节点首先决定哪些文档 确实 需要被取回。例如,如果我们的查询指定了 { "from": 90, ...转载 2018-03-20 15:21:21 · 224 阅读 · 0 评论 -
搜索选项
有几个 查询参数可以影响搜索过程。偏好偏好这个参数 preference 允许 用来控制由哪些分片或节点来处理搜索请求。 它接受像 _primary,_primary_first, _local, _only_node:xyz, _prefer_node:xyz, 和 _shards:2,3 这样的值, 这些值在search preference 文档页面被详细解释。但是最有用的值是某些随机字符串...翻译 2018-03-20 15:38:51 · 1116 阅读 · 0 评论 -
游标查询scroll
scroll 查询 可以用来对 Elasticsearch 有效地执行大批量的文档查询,而又不用付出深度分页那种代价。游标查询允许我们 先做查询初始化,然后再批量地拉取结果。 这有点儿像传统数据库中的 cursor 。游标查询会取某个时间点的快照数据。 查询初始化之后索引上的任何变化会被它忽略。 它通过保存旧的数据文件来实现这个特性,结果就像保留初始化时的索引 视图 一样。深度分页的代价根源是结果...翻译 2018-03-20 15:49:51 · 1000 阅读 · 0 评论 -
创建一个索引
到目前为止, 我们已经通过索引一篇文档创建了一个新的索引 。这个索引采用的是默认的配置,新的字段通过动态映射的方式被添加到类型映射。现在我们需要对这个建立索引的过程做更多的控制:我们想要确保这个索引有数量适中的主分片,并且在我们索引任何数据 之前 ,分析器和映射已经被建立好。为了达到这个目的,我们需要手动创建索引,在请求体里面传入设置或类型映射,如下所示:PUT /my_index{ "...翻译 2018-03-20 16:04:20 · 551 阅读 · 0 评论 -
删除一个索引
用以下的请求来 删除索引:DELETE /my_index你也可以这样删除多个索引:DELETE /index_one,index_twoDELETE /index_*你甚至可以这样删除 全部 索引:DELETE /_allDELETE /*对一些人来说,能够用单个命令来删除所有数据可能会导致可怕的后果。如果你想要避免意外的大量删除, 你可以在你的 elasticsearch.yml 做如下配...翻译 2018-03-20 16:35:47 · 4231 阅读 · 0 评论 -
请求体查询-查询表达式
查询表达式(Query DSL)是一种非常灵活又富有表现力的 查询语言。 Elasticsearch 使用它可以以简单的 JSON 接口来展现 Lucene 功能的绝大部分。在你的应用中,你应该用它来编写你的查询语句。它可以使你的查询语句更灵活、更精确、易读和易调试。要使用这种查询表达式,只需将查询语句传递给 query 参数:GET /_search{ "query": YOUR_QU...翻译 2018-02-28 10:28:01 · 418 阅读 · 0 评论