美文网首页
ES学习笔记1

ES学习笔记1

作者: 海的那一边 | 来源:发表于2021-01-11 11:30 被阅读0次

    学习文档地址:https://www.elastic.co/guide/cn/elasticsearch/guide/current/intro.html

    基础入门/你知道的,为了搜索.../索引员工文档

    一个 Elasticsearch 集群可以包含多个索引 ,每个索引可以包含多个类型 。这些不同的类型存储着多个文档 ,每个文档又有多个属性 。

    索引在不同语境下的含义:
    索引(名词):
    一个索引类似于传统关系数据库中的一个数据库 ,是一个存储关系型文档的地方。 索引 (index) 的复数词为 indices 或 indexes 。
    索引(动词):
    索引一个文档就是存储一个文档到一个索引(名词)中以便被检索和查询。这非常类似于 SQL 语句中的 INSERT 关键词,除了文档已存在时,新文档会替换旧文档情况之外。
    倒排索引:
    关系型数据库通过增加一个索引比如一个 B树(B-tree)索引到指定的列上,以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做倒排索引的结构来达到相同的目的。

    基础入门/你知道的,为了搜索.../轻量搜索

    我们使用下列请求来搜索索引库为megacorp类型为employee所有文档,一个搜索默认返回十条结果:
    GET /megacorp/employee/_search

    基础入门/你知道的,为了搜索.../使用查询表达式搜索

    使用 JSON 构造了一个请求,查询所有名为Smith的搜索:

    GET /megacorp/employee/_search
    {
        "query" : {
            "match" : {
                "last_name" : "Smith"
            }
        }
    }
    

    基础入门/你知道的,为了搜索.../全文搜索

    Elasticsearch 默认按照相关性得分排序,即每个文档跟查询的匹配程度。如果搜索的属性中包含了要搜索的内容(注意这里不是全部匹配)
    ,会在结果中展示。

    基础入门/你知道的,为了搜索.../短语搜索

    找出一个属性想要精确匹配一系列单词或者短语 。(注意是一个属性中,而且短语的单词都是挨着的)。

    基础入门/你知道的,为了搜索.../分布式特性

    Elasticsearch 尽可能地屏蔽了分布式系统的复杂性。这里列举了一些在后台自动执行的操作:
    分配文档到不同的容器或分片中,文档可以储存在一个或多个节点中。
    按集群节点来均衡分配这些分片,从而对索引和搜索过程进行负载均衡。
    复制每个分片以支持数据冗余,从而防止硬件故障导致的数据丢失。
    将集群中任一节点的请求路由到存有相关数据的节点。
    集群扩容时无缝整合新节点,重新分配分片以便从离群节点恢复。

    基础入门/集群内的原理/空集群

    一个运行中的 Elasticsearch 实例称为一个节点而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。

    当一个节点被选举成为 主 节点时, 它将负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。

    基础入门/集群内的原理/集群健康

    green
    所有的主分片和副本分片都正常运行。
    yellow
    所有的主分片都正常运行,但不是所有的副本分片都正常运行。
    red
    有主分片没能正常运行。

    基础入门/集群内的原理/添加索引

    一个 分片 是一个底层的 工作单元 ,它仅保存了全部数据中的一部分。 而现在我们只需知道一个分片是一个 Lucene 的实例(??节点不是一个ES实例吗??),以及它本身就是一个完整的搜索引擎。 我们的文档被存储和索引到分片内。

    Elasticsearch 是利用分片将数据分发到集群内各处的。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。

    一个分片可以是 分片或者 副本 分片。 索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。一个副本分片只是一个主分片的拷贝。副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改。

    基础入门/集群内的原理/水平扩容

    主分片的数目在索引创建时就已经确定了下来,定义了这个索引能够 存储的最大数据量。 但是,读操作——搜索和返回数据——可以同时被主分片或副本分片所处理,所以当你拥有越多的副本分片时,也将拥有越高的吞吐量。

    基础入门/数据输入和输出

    JSON是一种以人可读的文本表示对象的方法。当一个对象被序列化成为 JSON,它被称为一个 JSON 文档
    在 Elasticsearch 中, 每个字段的所有数据 都是 默认被索引的 。 即每个字段都有为了快速检索设置的专用倒排索引。

    基础入门/数据输入和输出/文档元数据

    一个文档不仅仅包含它的数据 ,也包含 元数据 —— 有关 文档的信息。 三个必须的元数据元素如下:
    _index
    文档在哪存放
    _type
    文档表示的对象类别
    _id
    文档唯一标识

    基础入门/数据输入和输出/索引文档

    一个文档的 _index 、 _type 和 _id 唯一标识一个文档,_id 可以自定义:

    PUT /{index}/{type}/{id}
    {
      "field": "value",
      ...
    }
    

    在 Elasticsearch 中每个文档都有一个版本号。当每次对文档进行修改时(包括删除), _version 的值会递增。
    如果你的数据没有自然的 ID, Elasticsearch 可以帮我们自动生成 ID 。 请求的结构调整为: 不再使用 PUT 谓词, 而是使用 POST 谓词。

    POST /{index}/{type}
    {
      "field": "value",
      ...
    }
    

    基础入门/数据输入和输出/取回一个文档

    GET /website/blog/123?pretty
    返回文档的一部分:
    GET /website/blog/123?_source=title,text
    只想得到 _source 字段,不需要任何元数据:
    GET /website/blog/123/_source

    基础入门/数据输入和输出/更新整个文档

    在 Elasticsearch 中文档是不可改变的。相反,如果想要更新现有的文档,需要重建索引或者进行替换

    PUT /website/blog/123
    {
      "title": "My first blog entry",
    ...
    }
    

    基础入门/数据输入和输出/创建新文档

    已有自己的_id,只有在相同的 _index 、 _type 和 _id 不存在时才接受我们的索引请求,两种方式:

    PUT /website/blog/123?op_type=create
    { ... }
    
    PUT /website/blog/123/_create
    { ... }
    

    基础入门/数据输入和输出/删除文档

    DELETE /website/blog/123

    基础入门/数据输入和输出/处理冲突

    悲观并发控制
    这种方法被关系型数据库广泛使用,它假定有变更冲突可能发生,因此阻塞访问资源以防止冲突。 一个典型的例子是读取一行数据之前先将其锁住,确保只有放置锁的线程能够对这行数据进行修改。
    乐观并发控制
    Elasticsearch 中使用的这种方法假定冲突是不可能发生的,并且不会阻塞正在尝试的操作。 然而,如果源数据在读写当中被修改,更新将会失败。应用程序接下来将决定该如何解决冲突。 例如,可以重试更新、使用新的数据、或者将相关情况报告给用户。

    基础入门/数据输入和输出/文档的部分更新

    我们也介绍过文档是不可变的:他们不能被修改,只能被替换。 update API 必须遵循同样的规则。 从外部来看,我们在一个文档的某个位置进行部分更新。然而在内部, update API 简单使用与之前描述相同的 检索-修改-重建索引 的处理过程。

    基础入门/分布式文档存储/路由一个文档到分片中

    shard = hash(routing) % number_of_primary_shards
    routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。 routing 通过 hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到 余数 。这个分布在 0 到 number_of_primary_shards-1 之间的余数,就是我们所寻求的文档所在分片的位置。

    基础入门/分布式文档存储/主分片和父分片如何交互

    我们可以发送请求到集群中的任一节点。 每个节点都有能力处理任意请求。 每个节点都知道集群中任一文档位置,所以可以直接将请求转发到需要的节点上。

    基础入门/搜索

    Elasticsearch 不只会存储(stores)文档,为了能被搜索到也会为文档。
    搜索重要概念:
    添加索引(indexes)
    映射(Mapping)
    描述数据在每个字段内如何存储
    分析(Analysis)
    全文是如何处理使之可以被搜索的
    领域特定查询语言(Query DSL)
    Elasticsearch 中强大灵活的查询语言

    基础入门/搜索/空搜索

    返回集群中所有索引的文档:
    GET /_search
    hits
    hits它包含total字段来表示匹配到的文档总数,并且一个 hits数组包含所查询结果的前十个文档。
    在 hits 数组中每个结果包含文档的** _index 、 _type 、 _id ,加上 _source 字段。
    每个结果还有一个
    _score ,它衡量了文档与查询的匹配程度**。默认情况下,首先返回最相关的文档结果,就是说,返回的文档是按照 _score 降序排列的。
    max_score 值是与查询所匹配文档的 _score 的最大值。
    _shards 部分告诉我们在查询中参与分片的总数,以及这些分片成功了多少个失败了多少个。

    基础入门/搜索/多索引,多类型

    /gb,us/user,tweet/_search
    在 gb 和 us 索引中搜索 user 和 tweet 类型

    基础入门/搜索/轻量搜索

    查询在 tweet 类型中 tweet 字段包含 elasticsearch 单词的所有文档:
    GET /_all/tweet/_search?q=tweet:elasticsearch
    返回包含 mary 的所有文档:
    GET /_search?q=mary
    当索引一个文档的时候,Elasticsearch 取出所有字段的值拼接成一个大的字符串,作为 _all 字段进行索引

    基础入门/映射和分析/分析与分析器

    分析器 实际上是将三个功能封装到了一个包里:
    字符过滤器
    首先,字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成 and
    分词器
    其次,字符串被 分词器 分为单个的词条。一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。
    Token 过滤器
    最后,词条按顺序通过每个 token 过滤器。这个过程可能会改变词条(例如,小写化 Quick ),删除词条(例如, 像 aandthe 等无用词),或者增加词条(例如,像 jumpleap 这种同义词)。

    基础入门/映射和分析/映射

    为了能够将时间域视为时间,数字域视为数字,字符串域视为全文或精确值字符串, Elasticsearch 需要知道每个域中数据的类型。这个信息包含在映射中。

    简单域类型
    字符串: string
    整数 : byte, short, integer, long
    浮点数: float, double
    布尔型: boolean
    日期: date

    默认, string 类型域会被认为包含全文。就是说,它们的值在索引前,会通过一个分析器,针对于这个域的查询在搜索前也会经过一个分析器。
    string 域映射的两个最重要属性是 index 和 analyzer
    index 属性控制怎样索引字符串。它可以是下面三个值:
    analyzed
    首先分析字符串,然后索引它。换句话说,以全文索引这个域。
    not_analyzed
    索引这个域,所以它能够被搜索,但索引的是精确值。不会对它进行分析。
    no
    不索引这个域。这个域不会被搜索到。
    对于 analyzed 字符串域,用 analyzer 属性指定在搜索和索引时使用的分析器。默认, Elasticsearch 使用 standard 分析器, 但你可以指定一个内置的分析器替代它,例如 whitespace 、 simple 和 english。

    基础入门/映射和分析/复杂核心域类型

    复杂核心域类型:JSON 还有 null 值,数组,和对象
    Lucene 不理解内部对象。 Lucene 文档是由一组键值对列表组成的。为了能让 Elasticsearch 有效地索引内部类,它把我们的文档转化成这样:

    {
        "tweet":            [elasticsearch, flexible, very],
        "user.id":          [@johnsmith],
        "user.gender":      [male],
        "user.age":         [26],
        "user.name.full":   [john, smith],
        "user.name.first":  [john],
        "user.name.last":   [smith]
    }
    

    基础入门/请求体查询/空查询

    空查询将返回所有索引库(indices)中的所有文档:
    GET /_search
    {}

    基础入门/请求体查询/查询表达式

    一个简单的查询:查询 tweet 字段中包含 elasticsearch 的文档
    GET /_search
    {
    "query": {
    "match": {?
    "tweet": "elasticsearch"
    }
    }
    }

    复杂一点的查询:复合(Compound) 语句 主要用于 合并其它查询语句:
    {
    "bool": {
    "must": { "match": { "tweet": "elasticsearch" }},
    "must_not": { "match": { "name": "mary" }},
    "should": { "match": { "tweet": "full text" }},
    "filter": { "range": { "age" : { "gt" : 30 }} }
    }
    }

    基础入门/请求体查询/查询与过滤

    过滤(filter)
    查询被设置成一个“不评分”或者“过滤”查询。回答也是非常的简单,yes 或者 no ,二者必居其一。
    查询(query)
    查询就变成了一个“评分”的查询。和不评分的查询类似,也要去判断这个文档是否匹配,同时它还需要判断这个文档匹配的有 多好(匹配程度如何)。

    基础入门/请求体查询/最重要的查询

    match_all查询:简单的匹配所有文档。在没有指定查询方式时,它是默认的查询。
    match查询
    如果你在一个全文字段上使用 match 查询,在执行查询前,它将用正确的分析器去分析查询字符串。
    如果在一个精确值的字段上使用它,例如数字、日期、布尔或者一个 not_analyzed 字符串字段,那么它将会精确匹配给定的值。
    对于精确值的查询,你可能需要使用 filter 语句来取代 query,因为 filter 将会被缓存。
    multi_match查询:可以在多个字段上执行相同的 match 查询。

    {
        "multi_match": {
            "query":    "full text search",
            "fields":   [ "title", "body" ]
        }
    }
    

    range查询:找出那些落在指定区间内的数字或者时间。
    term查询:被用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些 not_analyzed 的字符串。

    { "term": { "age":    26           }}
    { "term": { "date":   "2014-09-01" }}
    

    terms查询:和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件。
    exists查询和 missing查询:被用于查找那些指定字段中有值 (exists) 或无值 (missing) 的文档。

    基础入门/请求体查询/组合多查询

    你可以用 bool 查询来实现你的需求。这种查询将多查询组合在一起,成为用户自己想要的布尔查询。它接收以下参数:
    must
    文档 必须 匹配这些条件才能被包含进来。
    must_not
    文档 必须不 匹配这些条件才能被包含进来。
    should
    如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
    filter
    必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。

    相关文章

      网友评论

          本文标题:ES学习笔记1

          本文链接:https://www.haomeiwen.com/subject/asldwktx.html