zoukankan      html  css  js  c++  java
  • 《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.在搜索的时候,可以对搜索的文本进行“分析”。注意,matchmatch_phrase会分析,而term erms则不会。

    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.

  • 相关阅读:
    golang 垃圾回收 gc
    LINUX下目标文件的BSS段、数据段、代码段
    使用Golang利用ectd实现一个分布式锁
    KNN算法介绍
    机器学习
    golang map to struct
    NoSQL数据库-MongoDB和Redis
    Go语言中的单引号、双引号、反引号
    广告制胜无它,顺应人性尔——leo鉴书63
    从周迅发布恋情 看百度百科的社会价值
  • 原文地址:https://www.cnblogs.com/xujanus/p/11661869.html
Copyright © 2011-2022 走看看