100个Elasticsearch知识点大全

拼搏现实的明天。 2022-12-20 03:11 238阅读 0赞

文章目录

        • 理论篇
        • 工具篇

理论篇

1、文档的唯一性由_index, _type和routing-value(通常默认是该文档的_id)的组合来确定

2、数据被存储和索引在分片(shards)中,索引只是一个把一个或多个分片分组在一起的逻辑空间

3、文档是不可变的——它们不能被更改,只能被替换

4、主分片的数量只能在创建索引时定义且不能修改:如果主分片的数量在未来改变了,所有先前的路由值就失效了,文档也就永远找不到了。因为索引文档时是根据一定的Hash算法对主分片数量取余得到的

5、新索引默认有1个复制分片,这意味着为了满足quorum的要求需要两个活动的分片。当然,这个默认设置将阻止我们在单一节点集群中进行操作。为了避开这个问题,规定数量只有在number_of_replicas大于一时才生效。

6、文档能够从主分片或任意一个复制分片被检索。

7、请求节点知道每个文档所在的分片,并进行请求转发

8、搜索一个索引有5个主分片和5个索引各有一个分片事实上是一样的

9、当你在构建index没有自定义mappings时,Elasticsearch将使用动态映射猜测字段类型,这类型来自于JSON的基本数据类型

10、ES分布式检索分为查询和取回俩个阶段
查询:只包含documentID值和排序需要用到的值,例如_score
取回:协调节点根据聚合结果到各节点查询详细数据并返回给客户端

11、Lucene索引是Elasticsearch中的分片,Elasticsearch中的索引是分片的集合

12、写入磁盘的倒排索引是不可变的

13、ES的近实时搜索:文档的改动不会立即被搜索,但是会在一秒内可见

14、结构化搜索不关心文档的相关性或分数,它只是简单的包含或排除文档

15、布尔查询的得分计算
布尔查询通过把所有符合must 和 should的子句得分加起来,然后除以must 和 should子句的总数为每个文档计算相关性得分。
must_not子句并不影响得分;他们存在的意义是排除已经被包含的文档

16、布尔查询中所有的 must 子句必须匹配, 并且所有的 must_not 子句必须不匹配, 但是多少 should 子句应该匹配呢? 默认的,不需要匹配任何 should 子句,一种情况例外:如果没有must子句,就必须至少匹配一个should子句

17、在Elasticsearch中,每一个字段的数据都是默认被索引的。也就是说,每个字段专门有一个倒排索引用于快速检索。而且,与其它数据库不同,它可以在同一个查询中利用所有的这些倒排索引,以惊人的速度返回结果。

18、ES提供俩种查询方式:查询字符串和DSL查询。前者拼接在请求URL中,后者查询语句放在JSON体中

19、一旦文档被存储在Elasticsearch中,它就可以在集群的任一节点上被检索

20、索引名必须是全部小写,不能以下划线开头,不能包含逗号

21、ES创建文档我们可以自己提供一个_id,或者也使用index API 为我们自动生成一个_id。自动生成的ID有22个字符长,URL-safe, Base64-encoded string universally unique identifiers, 或者叫 UUIDs

22、如果你想做的只是检查文档是否存在——你对内容完全不感兴趣——使用HEAD方法来代替GET。HEAD请求不会返回响应体,只有HTTP头:

23、文档在Elasticsearch中是不可变的——我们不能修改他们。如果需要更新已存在的文档,我们可以使用index API 重建索引(reindex) 或者替换掉它。当执行PUT更新一个已存在的文档时,该文档_version会加一。在内部,Elasticsearch已经标记旧文档为删除并添加了一个完整的新文档。旧版本文档不会立即消失,但你也不能去访问它。Elasticsearch会在你继续索引更多数据时清理被删除的文档。

24、删除索引或文档
DELETE /_index/_type/_id 删除某条文档记录
DELETE /_index 删除索引及其对应的_type和文档记录

25、针对于版本控制,ES采用乐观并发控制,当文档被创建、更新或删除,文档的新版本会被复制到集群的其它节点。Elasticsearch即是同步的又是异步的,意思是这些复制请求都是平行发送的,并无序(out of sequence)的到达目的地。在构建index、get、delete请求时,每个文档都有一个_version号码,这个号码在文档被改变时加一。Elasticsearch使用这个_version保证所有修改都被正确排序。当一个旧版本出现在新版本之后,它会被简单的忽略。
我们可以利用_version的这一优点确保数据不会因为修改冲突而丢失。我们可以指定文档的version来做想要的更改。如果那个版本号不是现在的,我们的请求就失败了。所有更新和删除文档的请求都接受version参数,它可以允许在你的代码中增加乐观锁控制。

26、Elasticsearch中检索多个文档,相对于一个一个的检索,更快的方式是在一个请求中使用multi-get或者mget API(POST /_mget)

27、mget允许我们一次性检索多个文档一样,bulk API允许我们使用单一请求来实现多个文档的create、index、update或delete。这对索引类似于日志活动这样的数据流非常有用,它们可以以成百上千的数据为一个批次按序进行索引。 create:当文档不存在时创建;index:创建新文档或替换已有文档;update:局部更新文档;delete:删除一个文档

28、ES检索中三个重要的概念:映射(Mapping):数据在每个字段中解释说明,类似于DBMS的表结构定义;分析(Analysis):全文是如何处理的可以被搜索的;领域特定语言查询(Query DSL):ES使用的灵活的、强大的查询语言

29、对于一个简单的查询返回而言,常见的参考属性如下:
hits: 它包含了total字段来表示匹配到的文档总数,hits数组还包含了匹配到的前10条数据。
_score:相关性得分(relevance score),它衡量了文档与查询的匹配程度
max_score:指的是所有文档匹配查询中_score的最大值
took:告诉我们整个搜索请求花费的毫秒数
shards:参与查询的分片数
timeout:查询超时与否

30、多索引多类型查询方式参考
/_search 在所有索引的所有类型中搜索
/gb/_search 在索引gb的所有类型中搜索
/gb,us/_search 在索引gb和us的所有类型中搜索
/g*,u*/_search 在以g或u开头的索引的所有类型中搜索
/gb/user/_search 在索引gb的类型user中搜索
/gb,us/user,tweet/_search 在索引gb和us的类型为user和tweet中搜索
/_all/user,tweet/_search 在所有索引的类型为user和tweet中搜索

31、ES提供俩种方式的分页

查询字符串
GET /_search?size=5&from=10

结构化查询语句(DSL)
POST /_search
{
“from”: 30,
“size”: 10
}

32、映射(mapping)机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型(string, number, booleans, date等)。

分析(analysis)机制用于进行全文文本(Full Text)的分词,以建立供搜索用的倒排索引

33、全文字符串和准确字符串。其中全文字符串会进行分词,准确字符串不需要分词。

34、string类型字段默认值是analyzed。如果我们想映射字段为确切值,我们需要设置它为not_analyzed。analyzed表示首先分析这个字符串,然后索引。换言之,以全文形式索引此字段。

35、Lucene没法存放null值,所以一个null值的字段被认为是空字段。
“empty_string”: “”,
“null_value”: null,
“empty_array”: [],
“array_with_null_value”: [ null ]

以上四个字段将被识别为空字段而不被索引

36、ES可以使用GET提交查询请求并携带交互数据,事实上有些HTTP服务允许这种行为,只不过这种GET携带请求体的行为使用并不广泛

37、如果bool 查询下没有must子句,那至少应该有一个should子句。但是
如果有must子句,那么没有should子句也可以进行查询

38、filtered 的查询方式在ES 5.0中已被弃用并删除。现在应该改为使用bool / must / filter查询。

39、为了使一个string字段可以进行排序,它必须只包含一个词:即完整的not_analyzed字符串,未经分析器分词并排序的原字符串

40、对 analyzed 字段进行强制排序会消耗大量内存。

41、每个文档都有相关性评分,用一个相对的浮点数字段 _score 来表示 — _score 的评分越高,相关性越高。

42、ElasticSearch的相似度算法被定义为 TF/IDF,即检索词频率/反向文档频率

43、输出 explain 结果代价是十分昂贵的,它只能用作调试工具,千万不要用于生产环境

44、倒排索引在用于搜索时是非常卓越的,但却不是理想的排序结构。
当搜索的时候,我们需要用检索词去遍历所有的文档。
当排序的时候,我们需要遍历文档中所有的值,我们需要做反倒序排列操作。
为了提高排序效率,ElasticSearch 会将所有字段的值加载到内存中,这就叫做”数据字段”。FieldData

45、ElasticSearch中的字段数据常被应用到以下场景:
对一个字段进行排序
对一个字段进行聚合
某些过滤,比如地理位置过滤
某些与字段相关的脚本计算

46、当一个搜索请求被发送到一个节点Node,这个节点就变成了协调节点。这个节点的工作是向所有相关的分片广播搜索请求并且把它们的响应整合成一个全局的有序结果集。这个结果集会被返回给客户端。

47、每一个分片在本地执行查询和建立一个长度为from+size的有序优先队列——这个长度意味着它自己的结果数量就足够满足全局的请求要求。分片返回一个轻量级的结果列表给协调节点。只包含documentID值和排序需要用到的值,例如_score。

48、number_of_shards 定义一个索引的主分片个数,默认值是 5。这个配置在索引创建后不能修改。
number_of_replicas 每个主分片的复制分片个数,默认是 1。这个配置可以随时在活跃的索引上修改。

49、分析器三个基本组件:字符过滤器、分词器、标记过滤器

50、文档类型字段定义三个基本设置:
type(数据类型)、index(是否设置analyzed全文检索)、analyzer(设置分词器)

51、默认情况下,Elasticsearch 用 JSON 字符串来表示文档主体保存在 _source 字段中。像其他保存的字段一样,_source 字段也会在写入硬盘前压缩。

52、修改在已存在的数据最简单的方法是重新索引:创建一个新配置好的索引,然后将所有的文档从旧的索引复制到新的上。

53、索引 别名 就像一个快捷方式或软连接,可以指向一个或多个索引,也可以给任何需要索引名的 API 使用。别名带给我们极大的灵活性。可以帮助我们在一个运行的集群上无缝的从一个索引切换到另一个,给多个索引分类,给索引的一个子集创建 视图。
这里有两种管理别名的方式:_alias 用于单个操作,_aliases 用于原子化多个操作

54、支持一个字段多个值的最佳数据结构是倒排索引。倒排索引包含了出现在所有文档中唯一的值或词的有序列表,以及每个词所属的文档列表。

55、写入磁盘的倒排索引是不可变的

56、新的文档,在被写入磁盘的段之前,首先写入内存区的索引缓存,之后被进入到提交点,新的段加到了提交点,缓存被清空,之后写入到磁盘中

57、位于Elasticsearch和磁盘间的是文件系统缓存。在内存索引缓存中的文档被写入新的段,但是新的段首先写入文件系统缓存,这代价很低,之后会被同步到磁盘,这个代价很大。但是一旦一个文件被缓存,它也可以被打开和读取,就像其他文件一样。

58、ES存在一个事务日志(translog),来记录每次操作。当一个文档被索引,它被加入到内存缓存,同时加到事务日志。flush过后,段被全提交,事务日志清除

59、每个过滤器都被独立计算和缓存,而不管它们在哪里使用。如果两个不同的查询使用相同的过滤器,则会使用相同的字节集。同样,如果一个查询在多处使用同样的过滤器,只有一个字节集会被计算和重用。

60、在 bool 条件中过滤器的顺序对性能有很大的影响。更详细的过滤条件应该被放置在其他过滤器之前,以便在更早的排除更多的文档。

61、地理坐标点不能被动态映射(dynamic mapping)自动检测,而是需要显式声明对应字段类型为 geo_point

62、全文检索最重要的两个方面是:
相关度(Relevance)
根据文档与查询的相关程度对结果集进行排序的能力。相关度可以使用TF/IDF、地理位置相近程度、模糊相似度或其他算法计算。
分析(Analysis)
将一段文本转换为一组唯一的、标准化了的标记(token),用以(a)创建倒排索引,(b)查询倒排索引。
注意,一旦提到相关度和分析,指的都是查询(queries)而非过滤器(filters)

63、注意:像term或fuzzy一类的查询是低级查询,它们没有分析阶段。这些查询在单一的短语上执行,term查询只在倒排查询里精确地查找特定短语,而不会匹配短语的其它变形

64、match和query_string这样的查询是高级查询,即针对于全文搜索的查询,它们会对字段进行分析。

65、match查询的一个主要用途是进行全文搜索,match查询知道如何更好的处理全文检索和准确值检索。

66、我们可以在任何查询子句中指定一个boost值来控制相对权重,默认值为1。一个大于1的boost值可以提高查询子句的相对权重

工具篇

1、通过在查询语句中添加explain参数,可以得到更详细查询信息
GET /gb/tweet/_validate/query?explain
{
“query”: {
“tweet” : {
“match” : “really powerful”
}
}
}

2、在任意的查询字符串中增加pretty参数,会让Elasticsearch美化输出(pretty-print)JSON响应以便更加容易阅读。_source字段不会被美化,它的样子与我们输入的一致

GET /website/blog/123?pretty

3、查询index的映射Mappings工具

GET /index/_mapping/type

4、当调试一条复杂的查询语句时,想要理解相关性评分 _score 是比较困难的。ElasticSearch 在每个查询语句中都有一个explain参数,将 explain 设为 true 就可以得到更详细的信息。参考响应_explanation字段
GET /_search?explain=true
{
“query”: {
“match”: {
“tweet”: “honeymoon”
}
}
}

5、构建别名
PUT /my_index_v1/_alias/my_index
其中:my_index_v1是真实的索引,my_index是别名

6、手动刷新refresh 打开新段
POST /_refresh
POST /blogs/_refresh

【未完待续。。。】

发表评论

表情:
评论列表 (有 0 条评论,238人围观)

还没有评论,来说两句吧...

相关阅读