《Elasticsearch实战》读书笔记

遗留问题:

1._source字段和field字段的区别

2.q和search的区别(查询请求中)

3.输入关键字的大小写,参考prefix查询,match_phrase_prefix查询(4.4.2),有些查询不会被分析,所以区分大小写

 

第一章:ES介绍

1..快速查询:

  1)Lucene使用倒排索引,创建一个数据结构,记录每个单词出现在哪些数据中的清单

  2)为了提升搜索的性能和相关性,需要更多的磁盘空间来储存索引。增加新内容会越来越慢,因为每次添加数据就要更新索引。所以ES需要调优。

2.相关性:

  1)词频、逆文档词频。

  2)ES提供了很多内置功能来计算相关性得分,可以定制化,如:更新时间、出现位置、精确模糊

3.精确匹配:

  1)处理错误的拼写

  2)支持变体

  3)使用统计信息

  4)给予自动提示

4.ES的用法:当做独立的数据库、当做中间件(搜索)、当做工具(ELK)

 

第二章:深入功能

1.ES的逻辑结构:索引->类型->文档(数据库->数据表->行数据)

2.文档: 

  1)ES的最小单位

  2)json

  3)灵活的结构,层次

  4)文档的字段可以随意增减,但是字段类型及其设置,需要保存

3.类型

  1)映射:每个类型中字段的定义

  2)映射包含某个类型中当前索引的所有文档的所有字段定义。但不是所有的文档必须要有所有的字段定义

  3)如果有新文档带来了新的未定义的字段,ES可以自动猜测它,但不一定准,所以最好手动预先定义好

4.索引

  1)索引是(映射)类型的容器,包含所有字段定义和其它设置,如refresh_interval索引更新间隔(ES被称为是准实时的,就是指这种刷新过程)

  2)ES可以跨索引或类型搜索

5.分片:

  1)一个分片是一个目录中的文件,Lucene用这些文件储存索引

  2)一份分片是一个Lucene的索引。多个分片,组合成一个ES的索引

  3)副本分片是主分片的完整备份,用于搜索或者主分片丢失后成为新分片

  4)分片下包含:词条(倒排索引)、文档(ID)、词频(用于相关性计算)

7.节点、集群:

  1)一个节点是一个ES的实例,在服务器上启动ES之后,就拥有了一个节点(一个进程)。在一个服务器上启动多个进程,可以开多个节点

  2)多个节点可以加入一个集群(默认设置)。节点的分片在不同节点有副本分片。所以任何一个节点都可以宕机。

  3)集群的缺点,对于节点间的通信要快、稳。

8.水平扩展和垂直扩展

  1)水平扩展:通过集群,增加更多的节点

  2)垂直扩展:在同一个节点上,增加硬件条件(CPU、内存)

9.关于搜索:

  1)可以设置超时时间,对于大批量的数据,只会返回超时前所收集的结果

  2)会返回搜索相关的分片,成功失败信息

  3)可以用使用过滤器来查询结果,这样结果不会根据得分来排序

  4)可以通过聚集,来搜索结果,类似SQL里的group by 和 count

  5)可以通过ID,精确获取文档

 

第3章:索引、更新和删除数据

1.ES三种类型的字段:

  1)核心:字符串,数值型,日期,布尔

  2)数组和多元字段:如tags字段可以储存多个标签

  3)预定义:_ttl(time to live)和_timestamp,_all(所有字段)

2.字段设置:

  1)index:analyzed(默认)、not_analyzed(不分析词条:小写+拆分词条)、no(不索引,不会被搜索)

  2)所有核心类型都支持数组,无需修改映射,既可以使用但一值,也可以使用数组。也可以使用多字段(fields),针对每个下级字段进行设置

  3)预定义字段:

    1._source:原始json文档

    2._all:有所的字段一起索引

    3.唯一识别文档:_uid,_id,_type,_index

    4.其它:_size(原始文档内容大小)、_routing(路由到哪些分片)。其它还有很多

3.关于储存和搜索文档

  1)ES默认储存文档并放在_source字段里。也可以设置值存某些字段的数据(store字段设置)

  2)_source字段只是ES里的概念,对Lucene来说,和别的字段没有区别

  3)_all是索引所有的信息(_source是储存所有信息,注意区别),当搜索不指定特定字段时,会从它里面搜索。字段也可以设置不保存在_all字段中。

  4)ES内部有一个_uid,_id和_type组成它,是ES里文档的唯一标识。一般不可见,常用_id和_type

  5)文档字段中的_index(索引)默认是无法搜索它的(需要显示指定哪个index搜索)。_index字段在聚集(第7章)上有其价值

 

4.可以通过指定Groovy语法的脚本来更新文档(直接写语句):变量赋值,线程等待

5.关于更新时的版本控制:冲突时可以设置自动重试,更新时可以指定版本号,也可以使用外部版本号来同步到ES的版本号(需要设置参数)

6.可以按照类型去删除数据,也可以通过查询来删除文档(2种URL请求格式)

7.关闭索引:有些业务场景, 需要保留业务数据(如日志),可以选择关闭索引而不是删除它。这样可以大大降低ES的性能消耗,也可以保留数据

 

第四章:搜索数据

1.确定搜索范围:以符号分割的方式来命名索引,可以通过别名的方式来一次搜索所有相关的索引(通配符?)

2.搜索请求中,可以设置通配符,可以设置要返回和不要返回的字条

3.关于排序,可以选择按字段排序或者按得分排序,也可以2者结合一起用。避免在多值(数组)和分析字段上排序,结果不可预期

4.搜索结果返回的内容详见4.1.4小节

5.查询和过滤器:后者没有打分+有缓存,可以提升效率

6.查询:

  1)match_all:使用过滤器的时候,或者查询所有文档的时候用

  2)query_string:查询输入框,可以支持强大的Lucene语法

  3)term:词条

  4)terms:多个词条,可以指定匹配的最小数量

  5)match和phrase:可以查询有间隔的词组(分词?),将slop设为非1或者2

  6)multi_match:查询多个匹配字段

  PS.match查询是核心的查询类型

7.组合查询-bool查询(过滤器):可以实现必须、非必须、包含、非包含的逻辑

8.range查询:范围查询,因为不是二元匹配的,为了获得更好的性能,最好用在过滤器而不是查询中

9.wildcard查询:模糊匹配,性能压力更大,慎用。另一个类似的查询regexp查询,见第6章。

{
  "wildcard" : {
    "assistantBook.name" : {
      "wildcard" : "*汤试题搜索验证书一*",
      "boost" : 1.0
    }
  }
}

 注意:上面代码,会自动使用分词来查找,如果系统没做过分词,上面代码会搜不到任何结果(只能在单个字的时候,搜到)

  "wildcard" : {
    "assistantBook.name.keyword" : {
      "wildcard" : "*汤试题搜索验证书*",
      "boost" : 1.0
    }
  }

解决方法:我们在使用wildcard模糊查询的时候如果不想对字段内容进行分词查询的话,可以将内容变成keyword模式去查询,这样我们进行查询的时候就不会进行分词查询了

10.exsits和missing过滤器:查询相关字段是否存在

11.可以将query_string作为过滤器条件去设置,这样可以优化和缓冲此类查询(日志耗时告警?)

12.查询使用场景总结:

 

第五章:分析数据

1.分析处理步骤:

  1)字符过滤——使用字符过滤器转变字符

  2)文本切分为分词——将文本切分为单个或多个分词

  3)分词过滤——使用分词过滤器转变每个分词

  4)分词索引——将这些分词储存到索引中

2.在搜索的时候,可以对搜索的文本进行“分析”。注意,match\match_phrase会分析,而term\terms则不会。

3.针对同一个内容进行索引多次的时候,可以使用fileds(多字段类型)来储存分析方式不同的文本

4.可以使用API来测试分析的过程

5.一个分析器包括一个可选的字符过滤器、一个单个分词器、0个或多个分词过滤器

6.可以使用字典等多种方式来来提取词干(多种分词过滤器)

 

第六章:使用相关性进行搜索

1. TF-IDF:词频-逆文档频率。一篇文章中的词频越高,出现在多文档中的次数越小,相关得分越高

2.boosting,可以在索引文档,或者查询(推荐)的时候设置

3.可以通过explain参数(接口),来查询分析检索的结果,包括为什么不匹配,得分的解释

4.可以使用rescore(再打分)的方式,来优化打分效率,只针对前几页的返回结果打分排序(缩小查询范围)

5. 6.6章继续...

 

第八章:文档间的关系

1.对象类型:最快、最便捷的方法,但是没法保证内部文档之间的边界(因为每个对象的字段都被拍平储存)。所以会查询出期望之外的结果。在储存数据包含多个相似内容的时候(一堆数组的对象)。

2.嵌套类型(nested):将多个对象所以到多个分隔的文档,达到隔离的效果。但是可能会降低性能和并发性(因为每次更改都要索引整篇文档),这取决于文档多大,以及操作的频繁程度。

3.父子关系:将文档放在不同的类型,并在每种类型的映射中定义它们之间的关系

4.反规范化:将数据进行复制,达到多对多的关系 

5.应用端的连接:将数据单独储存,在分组中指包含它们的ID。

6.使用方式:

  1)对象映射:一对一关系

  2)嵌套文档和父子结构:一对多关系

  3)反规范化和应用端的连接:多对多关系

  

其它:

附录C——高亮功能:

1.可以设置no_match_size字段,来让没有命中的情况也返回字段内容

2.其它高亮选项:

  1)调整碎片的大小和数量

  2)修改高亮标签和编码

  3)为高亮指定不同的查询,而不是原来的主查询

3.高亮器的实现方式:

  1)简单型(plain)

  2)后高亮器(Posting Hignlignter)

  3)快速向量高亮器(Fast Vector Highlighter)

 

资料:

1.获取所有分片列表:10.0.11.135:9200/_cat/shards?v

2.获取映射列表:url/索引名称/_mapping/

3.获取映射:url/索引名称/_mapping/[具体的映射]

4.获取某个文档:url/索引/类型/文档ID

5.获取某个文档的字段:url/索引/类型/文档ID?fields=字段名1,字段名2

6.定义新的映射:参见3.1.1 .2

7.更新文档:url/索引/类型/文档ID/_update。可以使用upsert字段来设置当文档不存在时的内容。

8.删除文档:(delete请求)url/索引/类型/文档ID。删除操作也有版本号的控制。删除操作默认会缓存60秒,防止因已经删除的文档被立刻更新而创建

9.删除类型:(delete请求)url/索引/类型

10.查询并删除:(delete请求)url/索引/_query?q=关键字

11.搜索相关:

 

12.curl 'localhost: 9200/ get- together/_ search? from= 10& size= 10' ←--- 请求 匹配 了 所有 文档, URL 中 发送 了 from 和 size 参数

13.

 

配置:

1.elasticsearch.yml:ES的主要配置

2.logging.yml:日志配置

3.elasticsearch.in.sh:内存设置,JVM配置。ES的内存建议设置为可用内存的一半

4.ES的类型,是ES的一个逻辑概念,不属于Lucene。因此,不同类型的,同名字段应该设置为同一类型。 否则,ES无法识别。

5.

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-10-12 15:33  系统攻城狮  阅读(625)  评论(0编辑  收藏  举报