ElasticSearch之基本概念-文档、索引和REST API

190 阅读10分钟

文档

ElasticSearch是面向文档的,文档是所有可搜索数据的最小单元,文档会被序列化成JSON格式保存在ElasticSearch中,JSON文档格式灵活,不需要预先定义格式。

字段类型

JSON中的每个字段都有对应的字段类型(字符串/数值/布尔/日期/二进制/范围类型),可以指定或者自动推算。每个文档都有一个Unique ID,可以自己指定或者自动生成。

每个字段都有字段数据类型或者字段。此类指示字段包含的数据类型,比如strings或者boolean值和它的预期用途。例如,您可以将strings索引到text和keyword字段。但是text字段值会被进行全文搜索分析,同时keyword strings是被保留进行过滤和排序。

字段类型按family进行分组。同一系列中的类型支持相同的搜索功能,但是可能具有不同的空间使用和性能特征。

目前,唯一的类型family是keyword。它由keyword、constant_keyword和wildcard字段类型组成。其他类型family只有一个字段类型。比如,boolean类型family由一个字段类型组成:boolean。

常见类型

  • binary:编码为Base64字符串的二进制值。

  • boolean:true和false值

  • Keywords:keywords family,包括keyword、constant_keyword和wildcard。 keyword族包含以下字段类型:

    • keyword,用于结构化内容,例如IDs、电子邮件地址、主机名、状态代码、邮政编码或者标签。
    • constant_keyword,对于始终包含相同值的keyword字段。
    • wildcard,用于非结构化机器生成的内容。wildcard类型对具有大值或高基数的字段进行了优化。

    Keyword字段常用于sortingaggregationsterm-level queries,例如term

  • Numbers:数字类型,例如long和double,用于表示数量。

  • Dates:日期类型,包含date 和 date_nanos

  • alias:为现有字段定义别名。 在索引中alias映射定义一个字段的备用名称,在搜索请求中alias可以被使用代替目标字段,并选择其他APIs如field capabilities

PUT trips
{
  "mappings": {
    "properties": {
      "distance": {
        "type": "long"
      },
      "route_length_miles": {
        "type": "alias",
        "path": "distance" 
      },
      "transit_mode": {
        "type": "keyword"
      }
    }
  }
}

GET _search
{
  "query": {
    "range" : {
      "route_length_miles" : {
        "gte" : 39
      }
    }
  }
}

对象和关系类型

  • object:一个JSON对象。
PUT my-index-000001/_doc/1
{ 
  "region": "US",
  "manager": { 
    "age":     30,
    "name": { 
      "first": "John",
      "last":  "Smith"
    }
  }
}
PUT my-index-000001
{
  "mappings": {
    "properties": { 
      "region": {
        "type": "keyword"
      },
      "manager": { 
        "properties": {
          "age":  { "type": "integer" },
          "name": { 
            "properties": {
              "first": { "type": "text" },
              "last":  { "type": "text" }
            }
          }
        }
      }
    }
  }
}
  • flattened:作为单个字段值的整个 JSON 对象。

默认情况下,对象中的每个子字段都单独映射和索引。如果事先不知道子字段的名称或者类型,则会mapped dynamically它们。

flattened类型提供了另一种方法,其中整个对象是被映射为单字段。给定一个对象,flattened映射将解析出它的叶值并作为keywords索引它们到一个字段中。对象的内容可以通过简单的查询和聚合来搜索。

  • nested:保留其子字段之间关系的JSON对象。

nested类型是object数据类型的特殊版本,它允许以一种可以彼此独立查询的方式对对象数组进行索引。

  • join:为同一索引中的文档定义父/子关系。

join数据类型是一个在文档中创建父/子关系的特殊字段。relations部分定义了文档中一组可能关系,每个关系都是一个父名称和一个子名称。

有点像关系型数据定义的parent_id字段

结构化数据类型

  • Range:范围类型,例如long_rangedouble_range、 date_rangeip_range

新建索引和插入一个文档:

PUT range_index
{
  "settings": {
    "number_of_shards": 2
  },
  "mappings": {
    "properties": {
      "expected_attendees": {
        "type": "integer_range"
      },
      "time_frame": {
        "type": "date_range", 
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      }
    }
  }
}

PUT range_index/_doc/1?refresh
{
  "expected_attendees" : { 
    "gte" : 10,
    "lt" : 20
  },
  "time_frame" : {
    "gte" : "2015-10-31 12:00:00", 
    "lte" : "2015-11-01"
  }
}

查询:

GET range_index/_search
{
  "query" : {
    "range" : {
      "time_frame" : { 
        "gte" : "2015-10-31",
        "lte" : "2015-11-01",
        "relation" : "within" 
      }
    }
  }

结果:

{
  "took": 13,
  "timed_out": false,
  "_shards" : {
    "total": 2,
    "successful": 2,
    "skipped" : 0,
    "failed": 0
  },
  "hits" : {
    "total" : {
        "value": 1,
        "relation": "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "range_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "expected_attendees" : {
            "gte" : 10, "lt" : 20
          },
          "time_frame" : {
            "gte" : "2015-10-31 12:00:00", "lte" : "2015-11-01"
          }
        }
      }
    ]
  }
}

version字段类型是keyword字段的专门化,用于处理软件版本值并支持专门优先级规则。优先级是根据Semantic Versioning概述的规则进行定义的,例如,这意味着主,次和补丁版本部分是按数字排序(即。"2.1.0" < "2.4.1" < "2.11.2")和预发布版本是排序在发布版本之前(即。"1.0.0-alpha" < "1.0.0")。

如下:

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "my_version": {
        "type": "version"
      }
    }
  }
}
  • murmur3:计算和存储散列值。

聚合数据类型

存储metric aggregations的预聚合数值。aggregate_metric_double字段是一个包含minmaxsum, 和 value_count meric子字段的对象。

  • histogram:直方图形式的预聚合数值。

文本搜索类型

  • text字段: 文本family,包括text和match_only_text。经过分析的非结构化文本。

    • text:全文内容的传统字段类型,例如电子文件正文或产品描述。
    • match_only_text:一种空间优化的变体,它禁用评分并且在需要定位的查询上执行缓慢。它最适合索引日志消息。
  • annotated-text 包含特殊标记的文本,用于识别命名实体。

  • completion:用于自动完成建议。

    completion建议提供自动完成/边打字边搜索的功能。这是一个导航功能,用于在用户打字时引导用户达到相关结果,从而提高搜索精度。它并不意味着拼写纠正或你的意思功能,如术语或短语提示。

  • search_as_you_typetext-like 类型,用于按您的键入完成。

    Search-as-you-type 字段类型是一个text-like字段,经过优化提供给开箱即用的键入完成时的查询。它创建一系列子字段,这些子字段被分析为索引项,可以通过部分匹配整个索引文本值的查询来有效匹配这些索引项。支持前缀完成(即匹配输入开头的词)和中缀完成(即在输入内的任何位置匹配词)。

  • token_count:文本中的token计数。

    token_count字段类型实际上是一个integer字段接受字符串值,分析它们,然后索引字符串中的tokens数目。

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "name": { 
        "type": "text",
        "fields": {
          "length": { 
            # name.length字段是一个token_count multi-filed,它将索引name字段中的token数。
            "type":     "token_count",
            "analyzer": "standard"
          }
        }
      }
    }
  }
}

PUT my-index-000001/_doc/1
{ "name": "John Smith" }

PUT my-index-000001/_doc/2
{ "name": "Rachel Alice Williams" }


GET my-index-000001/_search
{
  "query": {
    "term": {
      # 这个查询仅匹配包含Rachel Alice Williams的文档,因为它有三个tokends。
      "name.length": 3 
    }
  }
}

文档排名类型

  • dense_vector:记录浮点值的密集向量

    dense_vector字段存储浮点值的密集向量。向量中可以包含的最大维数不应超过2048。dense_vector字段是单值字段。 dense_vector字段不支持查询、排序或聚合。 它们只能通过专用向量函数在脚本中访问。

    你将索引密集向量为浮点数组。

    PUT my-index-000001
    {
      "mappings": {
        "properties": {
          "my_vector": {
            "type": "dense_vector",
            // 3"dims": 3  
          },
          "my_text" : {
            "type" : "keyword"
          }
        }
      }
    }
    
    PUT my-index-000001/_doc/1
    {
      "my_text" : "text1",
      "my_vector" : [0.5, 10, 6]
    }
    
    PUT my-index-000001/_doc/2
    {
      "my_text" : "text2",
      "my_vector" : [-0.5, 10, 10]
    }
    
  • sparse_vector:记录浮点值的稀疏向量。

Deprecated in 7.6.

  • rank_feature:记录数字特征以提高查询时的命中率。

    rank_feature字段可以索引数字,以便他们以后在rank_feature查询中增强。

    PUT my-index-000001
    {
      "mappings": {
        "properties": {
          "pagerank": {
            # 排名特征字段必须使用`rank_feature`字段类型
            "type": "rank_feature" 
          },
          "url_length": {
            "type": "rank_feature",
            # 与分数负相关的排名特征需要声明它
            "positive_score_impact": false 
          }
        }
      }
    }
    
    PUT my-index-000001/_doc/1
    {
      "pagerank": 8,
      "url_length": 22
    }
    
    GET my-index-000001/_search
    {
      "query": {
        "rank_feature": {
          "field": "pagerank"
        }
      }
    }
    
  • rank_features:记录数字特征以提高查询时的命中率。

    rank_features字段可以索引数字特征向量,以便他们以后在rank_feature查询中增强。

    类似于rank_feature数据类型,但更适用于特征列表稀疏的情况,因此向每个特征的映射添加一个字段是不合理的。

    PUT my-index-000001
    {
      "mappings": {
        "properties": {
          "topics": {
            "type": "rank_features" 
          },
          "negative_reviews" : {
            "type": "rank_features",
            "positive_score_impact": false 
          }
        }
      }
    }
    
    PUT my-index-000001/_doc/1
    {
      "topics": { 
        "politics": 20,
        "economics": 50.8
      },
      "negative_reviews": {
        "1star": 10,
        "2star": 100
      }
    }
    
    PUT my-index-000001/_doc/2
    {
      "topics": {
        "politics": 5.2,
        "sports": 80.1
      },
      "negative_reviews": {
        "1star": 1,
        "2star": 10
      }
    }
    
    GET my-index-000001/_search
    {
      "query": { 
        "rank_feature": {
          "field": "topics.politics"
        }
      }
    }
    
    GET my-index-000001/_search
    {
      "query": { 
        "rank_feature": {
          "field": "negative_reviews.1star"
        }
      }
    }
    

空间数据类型

  • geo_point:纬度和经度点。
  • geo_shape:复杂的形状,例如多边形。
  • point:任意笛卡尔点。
  • shape:任意笛卡尔几何。

其他类型

  • percolator:用Query DSL编写的索引查询。

    percolator字段类型解析json结构为本地查询并存储该查询,以便percolate query可以使用它来匹配提供的文档。

    把查询条件记录下来,给后面使用

数组

在 Elasticsearch 中,数组不需要专用的字段数据类型。默认情况下,任何字段都可以包含零个或多个值,但是,数组中的所有值必须属于相同的字段类型。请参阅数组

多字段

为不同的目的以不同的方式索引同一个字段通常非常有用。例如,string字段可以映射为text字段用于全文搜索,也可以映射为keyword字段用于排序或聚合。或者你可以索引一个text字段使用standard analyzerenglish analyzer,和french analyzer

这就是multi-fields的目的。大部分字段类型支持多字段通过fields参数。

元数据

每个文档都有与之关联的元数据,例如_index,映射 _type,和_id元数据。创建映射类型时,可以自定义其中一些元数据字段的行为。

身份元数据字段

  • _index:文档所属的索引。
  • _type:文档映射类型。
  • _id:文档的ID。

文档源元数据字段

文档计数元数据字段

_doc_count:当文档表示预聚合数据时,用于存储文档数的常规字段。

索引元数据字段

路由元数据

  • _routing:将文档路由到特定分片的自定义路由值。

其他元数据

  • _meta:应用的特定元数据。
  • _tier:文档所属索引的当前数据层首选项。

索引

类比于MySQL如下:

  • MySQL => Databases => Tables => Columns/Rows
  • Elasticsearch => Indices => Types(Index) => Documents with Properties

创建索引

创建新索引。

PUT /my-index-000001

请求

PUT /<index>

描述

你可以使用创建索引API将索引添加至Elasticsearch集群中。创建索引时,您可以指定以下内容:

  • 索引设置
  • 索引中的字段映射
  • 索引别名

路径参数

<index>:(必须,字符串) 你要创建索引的名字。

索引名称必须满足以下条件:

  • 仅小写
  • 不能包括``, /*?"<>|, (空格字符), ,#
  • 7.0 之前的索引可以包含冒号 ( :),但已弃用并且在 7.0+ 中不再受支持
  • 不能以-_,+
  • 不能是...
  • 不能超过 255 个字节(注意它是字节,所以多字节字符将更快地计入 255 个限制)
  • .开头的名称已弃用,除隐藏索引和插件管理的内部索引之外

查询参数

  • wait_for_active_shards:(可选,String)在继续操作之前必须处于活动状态的分片副本数。设置为all或任何正整数,最多为索引中分片的总数 ( number_of_replicas+1)。默认值:1,主分片。
  • master_timeout:(可选,time units)等待连接到主节点的时间。如果在超时到期之前未收到响应,则请求失败并返回错误。默认为30s。
  • timeout:(可选,time units)等待响应时间。如果在超时到期之前未收到响应,则请求失败并返回错误。默认为30s。

请求正文

aliases:(可选,对象的对象)索引的别名。

  • aliases对象的属性

    • <alias>

      (Required, object) 键是别名。索引别名支持 date math

      对象主体包含别名的选项。支持空对象。

      属性<alias>

      • filter

        (可选,查询 DSL 对象)用于限制别名可以访问的文档的查询。

      • index_routing

        (可选,字符串)用于将索引操作路由到特定分片的值。如果指定,这将覆盖routing索引操作的值。

      • is_hidden

        (可选,布尔值)如果true,则隐藏别名。默认为 false. alias的所有indices必须具有相同的is_hidden值。

      • is_write_index

        (可选,布尔值)如果true,别名指向的索引是write index。默认为false.

      • routing

        (可选,字符串)用于将索引和搜索操作路由到特定分片的值。

      • search_routing

        (可选,字符串)用于将搜索操作路由到特定分片的值。如果指定,这将覆盖routing搜索操作的值。

  • mappings(可选,mapping对象)索引中字段的映射。如果指定,此映射可以包括:

请参阅映射

PUT /test
{
  "aliases": {
    "alias_1": {},
    "alias_2": {
      "filter": {
        "term": { "user.id": "kimchy" }
      },
      "routing": "shard-1"
    }
  },
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    "properties": {
      "field1": { "type": "text" }
    }
  }
}

基本api使用

查看索引相关信息

GET index

查看索引文档总数

GET index/_count

_cat/indices

# 模糊查找名为kiban的索引
GET /_cat/indices/*kibana*?v&s=index
# 查看状态为绿的索引
GET /_cat/indices?v&health=green
# 按照文档个数排序
GET /_cat/indices?v&s=docs.count:desc
# 查看具体的字段
GET /_cat/indices/movies?pri&v&h=health,index,pri,rep,docs.count,mt
# 查看每个索引的内存
GET /_cat/indices?v&h=i,tm&s=tm:desc

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情