Elasticsearch 核心概念

ElasticSearch

Elasticsearch 是一种开源的搜索和分析引擎,专门用于处理大规模的数据,并以非常快的速度进行搜索和分析。它基于一个叫做 Apache Lucene 的库构建,但与 Lucene 相比,Elasticsearch 提供了更多的功能和易用性,使其成为处理和分析数据的强大工具。

  • 开源:Elasticsearch 是开源的,这意味着它的代码是公开的,任何人都可以使用和修改它。开源社区的力量使得 Elasticsearch 不断改进和更新。
  • 分布式:Elasticsearch 天生支持集群分布式部署,能够运行在多台服务器上,并把数据分布存储在这些服务器上。这种设计使它能够处理非常大的数据集,并且即使一台服务器出现问题,其他服务器仍然可以继续工作。Elasticsearch 采用分布式架构设计数据被分成多个分片(shards)并分布存储在多个节点上每个分片可以有一个或多个副本(replicas),以提高数据的可用性和容错性。
    • 分片:将数据分成更小的块,分布在集群中的不同节点上,提高查询和索引的性能。
    • 副本:每个分片可以有多个副本,分布在不同节点上,确保数据的高可用性和容错性。

    这种分布式设计使得 Elasticsearch 能够轻松扩展,通过增加节点来处理更多的数据和更高的查询负载。

  • 基于 Apache Lucene:Lucene 是一个非常强大的搜索库,但直接使用 Lucene 需要编写大量代码。Elasticsearch 使 Lucene 变得更容易使用,提供了一个简单的接口和许多额外的功能,使构建搜索和分析应用程序变得更加简单。
  • 近实时(Near Real-Time):Elasticsearch 的一个重要特点是它的近实时搜索能力。当数据被存储到 Elasticsearch 中后,几乎立即就可以被搜索到。这对需要处理和分析实时数据的应用非常有用,比如日志监控系统。

在了解 Elasticsearch 的过程中,索引(Index)和文档(Document)是两个最基本也是最重要的概念。理解它们的作用和关系,有助于更好地掌握如何使用 Elasticsearch 存储、搜索和分析数据。

索引在 Elasticsearch 中是一个存储结构,用来组织和存储数据。你可以把它看作一个数据库或一个文件夹,其中包含了多个文档。每个索引都有一个唯一的名字,用于在操作数据时进行引用。

  • 在传统的关系数据库中,数据库是存储表的容器。
  • 在 Elasticsearch 中,索引是存储文档的容器。类似于关系型数据库(MySQL)中的数据库和表的组合体。

索引在 Elasticsearch 中是一个逻辑存储单元,类似于关系型数据库中的“数据库”概念。它是一个文档的集合,这些文档具有相似的特性或属于同一逻辑分类。每个索引可以包含多种类型的文档,而这些文档具有类似的结构。

索引可以包含一个或多个分片(Shards),每个分片都是一个 Lucene 实例,可以独立地进行搜索和存储操作。分片允许 Elasticsearch 在多个服务器上水平扩展,从而处理更多的数据和查询。
每个分片可以有零个或多个副本(Replicas),副本是分片的完整拷贝,用于提供数据的冗余和容错性。当某个分片所在的服务器出现故障时,可以从其副本中恢复数据。

文档是 Elasticsearch 中的数据单位。每个文档是一组键值对(键是字段名,值是字段值),并且存储在某个索引中。文档的格式通常是 JSON 格式,这使得它非常灵活和易于使用。

  • 在传统的关系数据库中,表中的一行就是一条记录。
  • 在 Elasticsearch 中,索引中的一个文档就是一个数据条目。

以下是关于 Elasticsearch 文档的一些重要概念和特点:

  1. 结构化数据文档是结构化的数据对象,由多个字段组成。每个字段都有一个名称和对应的值,可以是简单的数据类型(如文本、数字、日期等)或复杂的数据结构(如嵌套对象、数组等)。
  2. 唯一标识:每个文档都有一个唯一标识符(ID),用于在索引中唯一标识该文档。ID 可以由 Elasticsearch 自动生成,也可以由用户指定。
  3. 索引存储:文档被存储在索引中,每个索引可以包含多个文档。索引是文档的集合,类似于关系型数据库中的表。
  4. 字段映射:文档的字段映射定义了每个字段的数据类型、分析器等属性。字段映射可以手动指定,也可以由 Elasticsearch 根据插入的文档自动推断生成。
  5. 全文搜索:Elasticsearch 支持全文搜索,可以对文档中的文本字段进行全文检索。全文搜索可以根据关键词、词语匹配度等条件快速定位到符合条件的文档。
  6. CRUD 操作:文档支持 CRUD 操作,即创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)。通过 Elasticsearch 的 API 可以对文档进行增删改查操作。
  7. 版本控制:Elasticsearch 支持文档的版本控制,每个文档可以有多个版本。当对文档进行更新操作时,Elasticsearch 会自动创建新版本,并保存历史版本的数据。

文档是 Elasticsearch 中存储和组织数据的基本单位,具有灵活的数据模型、强大的全文搜索和分析功能,是构建分布式搜索引擎和分布式数据存储系统的核心组件之一。

> 索引与文档的关系类似于数据库与记录(相当于 MySQL 中的行(Row))的关系。一个索引包含多个文档,而每个文档属于某个索引。

GET _search
{
  "query": {
    "match_all": {}
  }
}

################################# 索引相关操作 ######################################
# 查看当前节点的所有索引 GET _cat/indices?v
GET _cat/indices?v

# 列出每个 Index 所包含的 Type
# 根据规划,Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将彻底移除 Type。
GET _mapping?pretty=true


# 查询指定索引 GET /索引名称
GET /accounts
GET /products

# 新建索引Index PUT /索引名称 [{mappings:{}}]
PUT /weather
# 新建索引并带有mappings参数
PUT /products 
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "standard"
      },
      "desc": {
        "type": "text",
        "analyzer": "standard"
      },
      "price": {
        "type": "float",
        "index": false
      },
      "type":{
        "type": "keyword",
        "index": false
      }
    }
  }
}
# 新增文档时如果索引不存在则自动创建索引(所以应留意索引名称不要写错)
# 新增索引accounts文档名称为person,默认为_doc
PUT /accounts/person/0001
{
  "username": "张珊",
  "password": "password",
  "sex": "women",
  "age": 16
}

# 修改索引 一旦创建,无法修改mapping。但是却允许添加新的字段到mapping中,因为不会对倒排索引产生影响
PUT /products/_mapping
{
  "properties": {
    "newField": {
      "type": "boolean"
    }
  }
}

# 删除索引
DELETE /products

# 分词 使用标准分词器
GET /_analyze
{
  "analyzer": "standard",
  "text": "Elasticsearch 是一种开源的搜索和分析引擎,专门用于处理大规模的数据,并以非常快的速度进行搜索和分析。"
}
# 分词 使用IK分词器 ik_smart ik_max_word
GET /_analyze
{
  "analyzer": "ik_smart",
  "text": "Elasticsearch 是一种开源的搜索和分析引擎,专门用于处理大规模的数据,并以非常快的速度进行搜索和分析。我是测试语句宏杉科技公司。"
}

################################# 文档相关操作 ######################################
# 创建文档 POST /{索引库名}/_doc/文档id
POST /products/_doc/10001
{
  "name": "iphone",
  "desc": "这是一部智能手机。",
  "price": 6999,
  "type": "数码",
  "newField": true
}
# POST可不指定ID,自动生成 比如sc7z6JoBLjhzI62VtAAu
POST /products/_doc
{
  "name": "xiaopeng",
  "desc": "这是一台新能源汽车。",
  "price": 166999,
  "type": "汽车",
  "newField": true
}

# PUT 必须指定ID 相当于走的是修改中全量修改
PUT /products/_doc/10002
{
  "name": "KFC",
  "desc": "这是吃的。",
  "price": 69,
  "type": "饮食",
  "newField": true
}

PUT /products/_doc/10003
{
  "name": "方便面",
  "desc": "吃的食品。",
  "price": 10,
  "type": "饮食",
  "newField": true
}


# 查询文档 GET /{索引库名}/_doc/文档id
GET /accounts/person/0001
GET /products/_doc/sc7z6JoBLjhzI62VtAAu
GET /products/_doc/10002

# 删除文档 DELETE /{索引库名}/_doc/文档id
DELETE /products/_doc/10002
DELETE /accounts/person/0001

# 修改文档:全量修改/增量修改
# 全量修改 PUT /{索引库名}/_doc/文档id  注意:可以删除减少/添加增加字段
# 如果id为新的那么相当于新增文档
PUT /accounts/person/0001
{
  "username": "李四",
  "password": "123456",
  "sex": "men",
  "age": 18,
  "address": "tst"
}


# 增量修改 POST /{索引库名}/_update/文档id { "doc": {字段}}
POST /products/_update/10001
{
  "doc": {
    "price": 10999
  }
}
GET /products/_doc/10001

################################# 数据查询 ####################################
# 查询全部数据 GET /索引名称/文档名称(默认_doc)/_search
# 返回数据中took字段表示该操作的耗时(单位为毫秒),timed_out字段表示是否超时,hits字段表示命中的记录,max_score最高的匹配程度
GET products/_doc/_search
GET accounts/person/_search


################################# 全文搜索 ##################################
GET /products/_doc/_search 
{
  "query":{
    "match": {
      "desc": "吃的"
    }
  }
}

# size 查询数量 from 起始索引
GET /products/_doc/_search 
{
  "query":{
    "match": {
      "desc": "这是"
    }
  },
  "size": 2,
  "from": 2
}

# or
GET /products/_doc/_search 
{
  "query":{
    "match": {
      "desc": "吃的 手机"
    }
  }
}

# and 
# [match] query doesn't support multiple fields, found [desc] and [price]
GET /products/_doc/_search 
{
  "query":{
    "match": {
      "desc": "吃的",
      "price": 56
    }
  }
}

GET /products/_doc/_search 
{
  "query":{
   "bool": {
     "must": [
       {
         "match": {
           "desc": "吃的"
         }
       },
       {
         "match": {
           "name": "KFC1"
         }
       }
    ]
   }
  }
}

# and 必须包含所有分词
GET /products/_doc/_search 
{
  "query": {
    "match": {
      "desc": {
        "query": "吃品",
        "operator": "and" 
      }
    }
  }
}

# 多字段搜索
GET /products/_doc/_search
{
  "query": {
    "multi_match": {
      "query": "面",
      "fields": ["name", "desc"]
    }
  }
}


# 高亮显示
GET /products/_doc/_search
{
  "query": {
    "match": {"desc": "吃的"}
  },
  "highlight": {
    "fields": {
      "desc": {
        "pre_tags": ["<strong>"],
        "post_tags": ["</strong>"]
      }
    }
  }
}

# 更多搜索https://jishuzhan.net/article/1943626551773409282

 

 

入门 ElasticSearch篇 - 程序员胡大圣 - 博客园

本站为非盈利性站点,所有资源、文章等仅供学习参考,并不贩卖软件且不存在任何商业目的及用途,如果您访问和下载某文件,表示您同意只将此文件用于参考、学习而非其他用途。
本站所发布的一切软件资源、文章内容、页面内容可能整理来自于互联网,在此郑重声明本站仅限用于学习和研究目的;并告知用户不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
如果本站相关内容有侵犯到您的合法权益,请仔细阅读本站公布的投诉指引页相关内容联系我,依法依规进行处理!
作者:理想
链接:https://www.imyjs.cn/archives/1509
THE END
分享
二维码
打赏
海报
Elasticsearch 核心概念
Elasticsearch 是一种开源的搜索和分析引擎,专门用于处理大规模的数据,并以非常快的速度进行搜索和分析。
<<上一篇
下一篇>>